Преобразование типов данных (ядро субд)data type conversion (database engine)
Содержание:
- Двоичные данные PL/SQL
- Термины и понятия, связанные с расширенными событиямиTerms and concepts in extended events
- Синонимы типов данных (Transact-SQL)
- Конструктор BigInt
- Точность, масштаб и длина (Transact-SQL)
- Описание типа данных datedate description
- См. также разделSee also
- ОграниченияRestrictions
- Типы данных «Any» PL/SQL
- Неявное преобразование типа
- RemarksRemarks
- Проблема
Двоичные данные PL/SQL
Oracle поддерживает несколько видов двоичных данных (это неструктурированные данные, которые не интерпретируются и не обрабатываются Oracle), в том числе RAW, LONG RAW, BFILE и BLOB. Тип данных BFILE хранит неструктурированные двоичные данные в файлах операционной системы вне базы данных. RAW — это тип данных переменной длины, подобный символьному типу данных VARCHAR2 и отличающийся от него тем, что утилиты Oracle не выполняют преобразования символов при передаче данных типа RAW.
ROWID
Oracle поддерживает два собственных типа данных, ROWID и UROWID, которые используются для представления адреса строки в таблице. ROWID — это уникальный адрес строки в соответствующей таблице, а UROWID — логическая позиция строки в индекс-таблице (index-organized table, IOT). ROWID также является SQL-псевдонимом, который может использоваться в командах SQL.
REF CURSOR
Тип данных REF CURSOR позволяет объявлять курсорные переменные, которые могут использоваться со статическими и динамическими командами SQL для реализации чрезвычайно гибких требований. Этот тип данных имеет две разновидности: строгий REF CURSOR и нестрогий REF CURSOR. Нестрогий REF CURSOR — это один из немногих доступных вам типов данных со слабой типизацией.
Рассмотрим пример объявления строгого типа REF CURSOR (ассоциируем курсорную переменную с конкретной записью при помощи атрибута %ROWTYPE):
Теперь рассмотрим два объявления нестрогого типа REF CURSOR, в которых никакая конкретная структура не ассоциируется с результирующей переменной. В четвертой строке представлен SYS_REFCURSOR, пред¬определенный нестрогий тип REF CURSOR.
Термины и понятия, связанные с расширенными событиямиTerms and concepts in extended events
В приведенной ниже таблице перечислены термины, используемые в связи с расширенными событиями, и объясняется их смысл.The following table lists the terms used for extended events, and describes their meanings.
ТерминTerm | ОписаниеDescription |
---|---|
сеанс событийevent session | Целью является конструкция, основанная на одном или нескольких событиях, а также вспомогательные элементы, такие как действия.A construct centered around one or more events, plus supporting items like actions are targets. Инструкция CREATE EVENT SESSION создает каждый сеанс событий.The CREATE EVENT SESSION statement constructs each event session. С помощью инструкции ALTER можно по желанию запускать и останавливать сеансы.You can ALTER an event session to start and stop it at will. Сеанс событий часто называется просто сеансом, если из контекста понятно, что имеется в виду именно сеанс событий.An event session is sometimes referred to as just a session, when the context clarifies it means event session. Более подробные сведения о сеансах событий см. в статье Сеансы расширенных событий SQL Server.Further details about event sessions are described in: SQL Server Extended Events Sessions. |
eventevent | Определенное событие в системе, наступление которого отслеживается активным сеансом событий.A specific occurrence in the system that is watched for by an active event session. Например, событие sql_statement_completed представляет момент завершения какой-либо инструкции T-SQL.For example, the sql_statement_completed event represents the moment that any given T-SQL statement completes. Событие может сообщать различные данные, например длительность.The event can report its duration and other data. |
targettarget | Элемент, который получает выходные данные из регистрируемого события.A item that receives the output data from a captured event. Служит для вывода данных.The target displays the data to you. Примерами могут служить event_file и его облегченная версия ring_buffer, хранимая в памяти.Examples include the event_file, and its handy light-weight cousin the memory ring_buffer. Более сложная целевая гистограмма выполняет ряд задач по обработке данных перед их выводом.The fancier histogram target performs some processing of your data before displaying it. Любой целевой объект можно использовать для любого сеанса событий.Any target can be used for any event session. Дополнительные сведения см. в разделе Целевые объекты для расширенных событий в SQL Server.For details, see Targets for Extended Events in SQL Server. |
actionaction | Поле, известное событию.A field known to the event. Данные из этого поля отправляются в целевой объект.Data from the field is sent to the target. Поле действия тесно связано с фильтром предиката.The action field is closely related to the predicate filter. |
фильтром предикатаpredicate filter | Проверка данных в поле события, благодаря которой только нужное подмножество экземпляров события отправляется целевому объекту.A test of data in an event field, used so that only an interesting subset of event occurrences are sent to the target. Например, фильтр может включать только те экземпляры события sql_statement_completed , в которых инструкция T-SQL содержит строку HAVING.For example, a filter could include only those sql_statement_completed event occurrences where the T-SQL statement contained the string HAVING. |
Пакетpackage | Квалификатор имени, добавляемый к каждому элементу в наборе элементов, связанном с пакетом событий.A name qualifier attached to each item in a set of items that centers around a core of events. Например, пакет событий может включать события, связанные с текстом T-SQL.For example, a package might have events about T-SQL text. Одно из событий может быть связано с кодом T-SQL в пакете, отделенном командой GO.One event could be about all the T-SQL in a GO-delimited batch. А другое более частное событие может быть связано с отдельными инструкциями T-SQL.Meanwhile another narrower event is about individual T-SQL statements. Кроме того, для каждой инструкции T-SQL есть события начала и завершения.Further, for any one T-SQL statement, there is are start and completed events. Соответствующие событиям поля также содержатся в пакете с событиями.Fields appropriate for the events are also in the package with the events. Большинство целевых объектов находятся в пакете package0 и используются с событиями из многих других пакетов.Most targets are in package0 and are used with events from many other packages. |
Синонимы типов данных (Transact-SQL)
Синонимы типов данных включены в SQL Server ради совместимости со спецификацией ISO.
Эти синонимы и соответствующие им системные типы данных SQL Server приведены в следующей таблице.
Синоним | Системный тип данных SQL Server |
---|---|
Binary varying | varbinary |
char varying | varchar |
character | char |
character | char(1) |
character(n) | char(n) |
character varying(n) | varchar(n) |
Dec | decimal |
Double precision | float |
float for n = 1-7 | real |
float for n = 8-15 | float |
integer | int |
national character(n) | nchar(n) |
national char(n) | nchar(n) |
national character varying(n) | nvarchar(n) |
national char varying(n) | nvarchar(n) |
national text | ntext |
timestamp | rowversion |
Синонимы типов данных можно использовать вместо соответствующих базовых типов данных в инструкциях языка определения данных (data definition language, DDL),
таких как CREATE TABLE, CREATE PROCEDURE или DECLARE @variable. Однако после создания объекта синонимы утрачивают силу.
При создании объекта ему назначается базовый тип данных, связанный с синонимом.
Никаких признаков того, что в инструкции, создавшей объект, был указан синоним, не остается.
Всем объектам, производным от первоначального объекта, таким, как столбцы результирующего набора или выражения, назначается базовый тип данных.
Все последующие вызовы функций работы с метаданными, выполняемые для первоначального объекта и любых производных от него объектов, сообщают базовый тип данных,
а не синоним. Это имеет место при работе с метаданными, например в процедуре sp_help и других системных хранимых процедурах, представлениях информационных схем и различных API-операции над метаданными, сообщающих типы данных столбцов таблицы или результирующего набора.
Конструктор BigInt
BigInt может быть создан с помощью конструктора. Аргумент, переданный BigInt(), автоматически преобразуется в BigInt.
BigInt("10"); // → 10n BigInt(10); // → 10n BigInt(true); // → 1n
Типы данных и значения, которые не могут быть преобразованы, вызывают исключение.
BigInt(10.2); // → RangeError BigInt(null); // → TypeError BigInt("abc"); // → SyntaxError
С числом BigInt, созданным с помощью конструктора, можно выполнять арифметические операции:
BigInt(10) * 10n; // → 100n
При использовании в качестве операндов оператора строгого равенства числа BigInt, созданные с помощью конструктора, обрабатываются аналогично обычным.
BigInt(true) === 1n; // → true
Точность, масштаб и длина (Transact-SQL)
Точность представляет собой количество цифр в числе. Масштаб представляет собой количество цифр справа от десятичной запятой в числе. Например: число 123,45 имеет точность 5 и масштаб 2.
В среде SQL Server максимальная точность типов данных numeric и decimal по умолчанию составляет 38 разрядов. В более ранних версиях SQL Server максимум по умолчанию составляет 28.
Длиной для числовых типов данных является количество байт, используемых для хранения числа. Длина символьной строки или данных в Юникоде равняется количеству символов. Длина для типов данных binary, varbinary и image равна количеству байт. Например, тип данных int может содержать 10 разрядов, храниться в 4 байтах и не должен содержать десятичный разделитель. Тип данных int имеет точность 10, длину 4 и масштаб 0.
При сцеплении двух выражений типа char, varchar, binary или varbinary длина результирующего выражения является суммой длин двух исходных выражений, но не превышает 8 000 символов.
При сцеплении двух выражений типа nchar или nvarchar длина результирующего выражения является суммой длин двух исходных выражений, но не превышает 4 000 символов.
Если два выражения одного и того же типа данных, но разной длины, сравниваются с помощью предложения UNION, EXCEPT или INTERSECT, длина результата будет равняться длине максимального из двух выражений.
Точность и масштаб числовых типов данных, кроме decimal, фиксированы. Если арифметический оператор объединяет два выражения одного и того же типа, результат будет иметь тот же тип данных с точностью и масштабом, определенными для этого типа. Если оператор объединяет два выражения с различными числовыми типами данных, тип данных результата будет определяться правилами старшинства типов данных. Результат имеет точность и масштаб, определенные для этого типа данных.
Следующая таблица определяет, как вычисляется точность и масштаб результата, если результат операции имеет тип decimal. Результат имеет тип decimal, если одно из следующих утверждений является истиной:
- Оба выражения имеют тип decimal.
- Одно выражение имеет тип decimal, а другое имеет тип данных со старшинством меньше, чем decimal.
Выражения операндов обозначены как выражение e1 с точностью p1 и масштабом s1 и выражение e2 с точностью p2 и масштабом s2. Точность и масштаб для любого выражения, отличного от decimal, соответствуют типу данных этого выражения
Операция | Точность результата | Масштаб результата * |
---|---|---|
e1 + e2 | max(s1, s2) + max(p1-s1, p2-s2) + 1 | max(s1, s2) |
e1 — e2 | max(s1, s2) + max(p1-s1, p2-s2) + 1 | max(s1, s2) |
e1 * e2 | p1 + p2 + 1 | s1 + s2 |
e1 / e2 | p1 — s1 + s2 + max(6, s1 + p2 + 1) | max(6, s1 + p2 + 1) |
e1 { UNION | EXCEPT | INTERSECT } e2 | max(s1, s2) + max(p1-s1, p2-s2) | max(s1, s2) |
e1 % e2 | min(p1-s1, p2 -s2) + max( s1,s2 ) | max(s1, s2) |
* Точность и масштаб результата имеют абсолютный максимум, равный 38. Если значение точности превышает 38, то соответствующее значение масштаба уменьшается, чтобы по возможности предотвратить усечение целой части результата.
Описание типа данных datedate description
СвойствоProperty | ЗначениеValue |
---|---|
СинтаксисSyntax | datedate |
ИспользованиеUsage | DECLARE @MyDate dateDECLARE @MyDate dateCREATE TABLE Таблица1 ( Столбец1 date )CREATE TABLE Table1 ( Column1 date ) |
Формат строковых литералов по умолчаниюDefault string literal format(используется для клиента нижнего уровня)(used for down-level client) | ГГГГ-ММ-ДДYYYY-MM-DDДополнительные сведения см. в подразделе «Обратная совместимость для клиентов низкого уровня» следующего раздела.For more information, see the «Backward Compatibility for Down-level Clients» section that follows. |
ДиапазонRange | От 0001-01-01 до 9999-12-31 (от 1582-10-15 до 9999-12-31 для Informatica)0001-01-01 through 9999-12-31 (1582-10-15 through 9999-12-31 for Informatica)От 1 января 1 года до 31 декабря 9999 года нашей эры (от 15 октября 1582 года до 31 декабря 9999 года для Informatica).January 1, 1 CE (Common Era) through December 31, 9999 CE (October 15, 1582 CE through December 31, 9999 CE for Informatica) |
Диапазоны элементовElement ranges | ГГГГ обозначает 4 цифры, которые представляют год и принимают значения от 0001 до 9999.YYYY is four digits from 0001 to 9999 that represent a year. Для Informatica значение ГГГГ ограничено диапазоном от 1582 до 9999.For Informatica, YYYY is limited to the range 1582 to 9999.ММ обозначает 2 цифры, которые представляют месяц и принимают значения от 01 до 12.MM is two digits from 01 to 12 that represent a month in the specified year.ДД обозначает две цифры, представляющие день указанного месяца и принимающие значения от 01 до 31 в зависимости от месяца.DD is two digits from 01 to 31, depending on the month, that represents a day of the specified month. |
Длина в символахCharacter length | 10 позиций10 positions |
Точность, масштабPrecision, scale | 10, 010, 0 |
Объем памятиStorage size | 3 байта, фиксированный3 bytes, fixed |
Структура хранилищаStorage structure | Дата хранится в одной переменной типа integer размером 1 или 3 байта.1, 3-byte integer stores date. |
ТочностьAccuracy | Один деньOne day |
Значение по умолчаниюDefault value | 1900-01-011900-01-01Это значение используется как присоединяемая часть даты при неявном преобразовании данных типа time в значение типа datetime2 или datetimeoffset.This value is used for the appended date part for implicit conversion from time to datetime2 or datetimeoffset. |
КалендарьCalendar | ГригорианскийGregorian |
Определяемая пользователем точность в долях секундыUser-defined fractional second precision | НетNo |
Учет и сохранение смещения часового поясаTime zone offset aware and preservation | НетNo |
Учет перехода на летнее времяDaylight saving aware | НетNo |
См. также разделSee also
ALTER TABLE (Transact-SQL)ALTER TABLE (Transact-SQL)Функции CAST и CONVERT (Transact-SQL)CAST and CONVERT (Transact-SQL)COLLATE (Transact-SQL)COLLATE (Transact-SQL)CREATE TABLE (Transact-SQL)CREATE TABLE (Transact-SQL)Типы данных (Transact-SQL)Data Types (Transact-SQL)DECLARE @local_variable (Transact-SQL)DECLARE @local_variable (Transact-SQL)LIKE (Transact-SQL)LIKE (Transact-SQL)SET ANSI_PADDING (Transact-SQL)SET ANSI_PADDING (Transact-SQL)SET @local_variable (Transact-SQL) SET @local_variable (Transact-SQL) Поддержка параметров сортировки и Юникода Collation and Unicode Support Однобайтовые и многобайтовые кодировкиSingle-Byte and Multibyte Character Sets
ОграниченияRestrictions
В списке ниже перечислены типы значений, которые не могут сохраняться с помощью типа данных sql_variant.The following lists the types of values that cannot be stored by using sql_variant:
- datetimeoffset1datetimeoffset1
- geographygeography
- geometrygeometry
- hierarchyidhierarchyid
- imageimage
- ntextntext
- nvarchar(max)nvarchar(max)
- rowversion (timestamp)rowversion (timestamp)
- texttext
- varchar(max)varchar(max)
- varbinary(max)varbinary(max)
- sql_variantsql_variant
- Определяемые пользователем типыUser-defined types
- xmlxml
1 SQL Server 2012 и более поздней версии не ограничивает datetimeoffset.1 SQL Server 2012 and greater do not restrict datetimeoffset.
Типы данных «Any» PL/SQL
Обычно перед программистом стоит вполне конкретная задача с жестко заданными требованиями. Но случается и так, что необходимо написать нечто общее, для широкого применения. В таких случаях удобно использовать типы данных «Any».
Типы «Any» появились в версии Oracle9/ Database Release 1. Они значительно отличаются от любых других типов данных, доступных в Oracle. Эти типы позволяют динамически инкапсулировать описания типов, экземпляры данных и наборы экземпляров данных любого другого типа SQL, а также обращаться к таким объектам. Вы можете использовать эти типы (и методы, определенные для них как для объектных типов), например для определения типа данных, хранящихся в некоторой вложенной таблице, без обращения к реальному объявлению типа данной таблицы.
Группа типов данных «Any» включает в себя AnyType, AnyData и Any- DataSet.
Неявное преобразование типа
При неявном преобразовании типов данных может потеряться информация, поэтому операции между BigInt и Number не допускаются. При операциях с большими целыми числами и чисел с плавающей запятой результирующее значение может быть представлено как BigInt или Number. Рассмотрим следующий пример:
(9007199254740992n + 1n) + 0.5
Результат этого выражения находится вне диапазона BigInt и Number. Число с дробной частью не может быть точно преобразовано в BigInt. И BigInt больше 253 не может быть точно преобразовано в Number.
Из-за этого невозможно выполнять арифметические операции между Number и BigInt. Попытка сделать это вызовет ошибку TypeError:
10 + 10n; // → TypeError Math.Max(2n, 4n, 6n); // → TypeError
Но операторы сравнения не следуют этому правилу:
10n > 5; // → true
Если вы хотите выполнить арифметические вычисления с BigInt и Number, сначала необходимо определить область, в которой должна быть выполнена операция. Для этого преобразуйте любой из операндов, вызвав конструктор Number() или BigInt():
BigInt(10) + 10n; // → 20n // или 10 + Number(10n); // → 20
Число BigInt считается истинным значением, если оно не равно 0n:
if (5n) { // этот блок кода будет выполнен } if (0n) { // а этот нет }
При сортировке массива, состоящего из элементов BigInt и Number, не происходит явного преобразования типов:
const arr = ; arr.sort(); // →
Битовые операторы, такие как |, &, <<, >> и ^, работают с BigInt так же, как с Number. Смешанные операнды не допускаются. Вот некоторые примеры:
90 | 115; // → 123 90n | 115n; // → 123n 90n | 115; // → TypeError
RemarksRemarks
Тип данных int является основным типом целочисленных данных в SQL ServerSQL Server.The int data type is the primary integer data type in SQL ServerSQL Server. Тип данных bigint используется для хранения значений, выходящих за диапазон, поддерживаемый типом данных int.The bigint data type is intended for use when integer values might exceed the range that is supported by the int data type.
В таблице приоритетов типов данных тип bigint располагается между smallmoney и int.bigint fits between smallmoney and int in the data type precedence chart.
Функции возвращают bigint только в случае, если выражение параметра имеет тип bigint.Functions return bigint only if the parameter expression is a bigint data type. SQL ServerSQL Server не выполняет автоматического продвижения других целочисленных типов данных (tinyint, smallint и int) до bigint.does not automatically promote other integer data types (tinyint, smallint, and int) to bigint.
Внимание!
При использовании таких арифметических операторов, как +, –, *, / или %, для явного или неявного преобразования констант типа int, smallint, tinyint или bigint в значения типа float, real, decimal или numeric в SQL ServerSQL Server используются различные правила определения типов данных и точности результата, зависящие от наличия автоматической параметризации запроса.When you use the +, -, *, /, or % arithmetic operators to perform implicit or explicit conversion of int, smallint, tinyint, or bigint constant values to the float, real, decimal or numeric data types, the rules that SQL ServerSQL Server applies when it calculates the data type and precision of the expression results differ depending on whether the query is autoparameterized or not.
Поэтому одинаковые выражения в различных запросах могут иногда возвращать различные результаты.Therefore, similar expressions in queries can sometimes produce different results. В случае отсутствия в запросе автоматической параметризации константа сначала преобразуется в значение типа numeric, точности которого хватает для ее хранения, а затем происходит преобразование в заданный тип данных.When a query is not autoparameterized, the constant value is first converted to numeric, whose precision is just large enough to hold the value of the constant, before converting to the specified data type. Например, константа 1 преобразуется в numeric (1, 0) , а константа 250 — в numeric (3, 0) .For example, the constant value 1 is converted to numeric (1, 0), and the constant value 250 is converted to numeric (3, 0).
При наличии в запросе автоматической параметризации константа всегда сначала преобразуется в значение типа numeric (10, 0) , а затем в данные конечного типа.When a query is autoparameterized, the constant value is always converted to numeric (10, 0) before converting to the final data type. При использовании оператора «/» могут различаться как точность, так и само значение результата.When the / operator is involved, not only can the result type’s precision differ among similar queries, but the result value can differ also. Например, результат автопараметризованного запроса, включающего в себя выражение , отличается от аналогичного запроса без автоматической параметризации, так как результаты выполнения автопараметризованного запроса усекаются до значений, соответствующих типу данных numeric (10, 0) .For example, the result value of an autoparameterized query that includes the expression , differs from the result value of the same query that is not autoparameterized, because the results of the autoparameterized query, are truncated to fit into the numeric (10, 0) data type.
Проблема
До текущего момента, все числа, и целые и дробные были представлены одним типом Number, так же имеющим название “double-precision floats”. Если не вникать в подробности, то это означает, что этот тип имеет ограниченную точность. Константа Number.MAX_SAFE_INTEGER хранит максимально возможное целое число, которое можно безопасно увеличивать. Его значение равно двум в пятдесят третьей степени, минус один (2**53–1).
https://gist.github.com/Hydrock/7a242724118b8d02be61ced6beb5525b
Попробуем сложить максимальное число и единицу. Результат верный — число больше на единицу.
https://gist.github.com/Hydrock/ffa382914be49fcf7947c6375c4c518c
Но при сложении с двойкой, JS выдает ошибочный результат, в нашем случае такой же как и предыдущий.
https://gist.github.com/Hydrock/3334e15e657fd3c1ee4c35aa2be245c8
Проблема, думаю, видна. Все расчеты, вне диапазона от Number.MIN_SAFE_INTEGER до Number.MAX_SAFE_INTEGER, могут быть неточными.
BigInt — новый числовой примитив, который позволяет использовать большие числа с высокой точностью.
Чтобы создать BigInt, добавьте суффикс n в любой целочисленный литерал. Например, 123 становится 123n. Глобальную функцию BigInt можно использовать для преобразования обычного числа в BigInt. Другими словами, BigInt (123) === 123n. Теперь решим нашу проблему используя BigInt.
https://gist.github.com/Hydrock/8673fdb014587fef724f7235c3c096f0
Результат верный!
Вот еще один пример, где мы умножаем два числа с типом Number:
https://gist.github.com/Hydrock/31925f7e931cd00b06850b397013d565
Мы знаем, что результат умножения должен заканчиваться на 7 (так как последние цыфры в числах 9 и 3, 9 * 3 === 27 ). Однако результат заканчивается набором нулей. Повторим то жесамое с BigInts:
https://gist.github.com/Hydrock/26980a29256b6783144c9dce4c5939a3
И снова, с BigInt, ответ верный.
Безопасные пределы (Number.MIN_SAFE_INTEGER, Number.MAX_SAFE_INTEGER) не применяются к BigInts. Мы можем спокойно выполнять целочисленную арифметику , не беспокоясь о потере точности.