Типы данных
Функция
Определение типов данных.
Спецификация
::=
::=
::=
::=
::=
::=
::=
::=
::=
::=
::=
::=
::=
::=
::=
::=
::=
::=
::=
::=
Синтаксические правила
-
CHAR
является синонимомCHARACTER
. -
VARCHAR
является синонимомCHAR VARYING
,CHARACTER VARYING
. -
VARBYTE
является синонимомBYTE VARYING
. -
NCHAR
является синонимомNATIONAL CHAR
,NATIONAL CHARACTER
. -
NCHAR VARYING
является синонимомNATIONAL CHAR VARYING
,NATIONAL CHARACTER VARYING
,NVARCHAR
. -
DEC
,DECIMAL
,NUMERIC
иNUMBER
являются синонимами. -
INT
является синонимомINTEGER
. -
DOUBLE
является синонимомDOUBLE PRECISION
. -
Значение
< длины >
и< точности >
должно быть больше 0. -
Если
< длина >
не задана, по умолчанию принимается значение 1. -
Если
< масштаб >
не задан, по умолчанию принимается значение 0.
Общие правила
-
Тип данных
CHAR
задает строку символов фиксированной длины (максимальная длина строки – 4000 байтов). Если реальное количество символов в строке меньше< длины >
, то при записи в БД строка дополняется до заданной< длины >
пробелами справа и при выборке возвращается с дополненными пробелами.Примечание
Если ядро СУБД запущено с ключом
/COMPATIBILITY=STANDARD
, то функцияlength
концевые нули учитывает, иначе игнорирует.create table tab1(c char(50)); insert into tab1 values ('1234567890'); select c, length(c) from tab1; |1234567890 |50 |
-
Тип данных
VARCHAR
задает строку символов переменной длины (максимальная длина строки – 4000 байтов). Если реальное количество символов в строке меньше< длины >
, то строка при записи в БД или при выборке из БД не дополняется до заданной< длины >
пробелами. Фактическая длина значений типаVARCHAR
хранится в БД.Примечание
Пробелы для типа VARCHAR и не дополняются и не усекаются, всегда хранится реальная длина (с концевыми пробелами, если они были заданы при занесении значения, и без них, если они не были заданы.
create or replace table tab1(vc varchar(50)); insert into tab1 values ('123 '); -- три пробела в конце значения select vc, length(vc) from tab1; VC -- |123 | 6|
Примечание
В типах данных CHAR, VARCHAR длина и количество символов в строке эквивалентны только для однобайтовых кодировок. Например, если для столбца типа CHAR(N) или VARCHAR(N) задана многобайтовая кодировка (например, UTF-8), то в этот столбец всегда можно занести значение, состоящее не более чем из N байт в этой кодировке, однако не всегда можно занести значение, состоящее не более чем из N символов. Поэтому, если пользователь работает в кодировке UTF-8, но использует только основной набор символов и кириллицу, ему лучше выбрать для соответствующих столбцов одну из однобайтовых кириллических кодировок (CP866, CP1251 или KOI8-R). Тогда в поле CHAR(N) он всегда сможет занести кириллическую строку до N символов включительно.
-
Любой строковый тип данных может иметь значение длины
0
. -
Столбец как базовой таблицы, так и подзапроса не может иметь значение длины
0
. -
При выборке константы в SELECT-запросе столбец наследует тип выбираемого выражения. В случае пустой строки этот тип должен быть скорректирован, чтобы длина не была нулевой.
-
Тип данных
BYTE
задает строку байт фиксированной длины (максимальная длина байтовой строки – 4000 байтов). Если реальное количество байт в строке меньше< длины >
, то строка при записи в БД или при выборке из БД дополняется до заданной< длины >
двоичными нулями справа. Длина значений типаBYTE
в БД не хранится.Примечание
Если ядро СУБД запущено с ключом
/COMPATIBILITY=STANDARD
, то функцияlength
концевые нули учитывает, иначе игнорирует.create table tab1(b byte(20)); insert into tab1 values (hex('12ffca4527')); select b, length(b) from tab1; |12FFCA4527000000000000000000000000000000 |20 | select trim(rawtohex(b), '0'), length(b) from tab1; |12FFCA4527 |20 |
-
Тип данных
VARBYTE
задает строку байт переменной длины (максимальная длина байтовой строки – 4000 байтов). Если реальное количество байт в строке меньше < длины >, то строка не дополняется до заданной< длины >
двоичными нулями.Примечание
Независимо от режима запуска ядра СУБД (с ключом или без ключа
/COMPATIBILITY=STANDARD
) концевые нули всегда усекаются.create table tab1(vb varbyte(20)); insert into tab1 values (hex('12ffca4527')); select vb, length(vb) from tab1; |12FFCA4527 |5 |
-
Строка символов/байт состоит из последовательности символов (байт) с кодами от 0 до 255.
-
Для символьных строк поддерживается преобразование к соответствующей кодировке (русская, латинская, верхний/нижний регистр), байтовые строки независимы от используемой кодовой страницы.
select lower('НПП "Релэкс"'), upper('НПП "Релэкс"'); |нпп "релэкс" |НПП "РЕЛЭКС" |
-
Длина строки, не содержащей символов/байт, равна
0
. -
Строка символов/байт может иметь неопределенное (NULL) значение.
create table tab1(vb byte(20), c char (10)); insert into tab1 values (hex('12ffca4527'), null); select count(*) from tab1 where c is null; |1 |
-
Все строки символов сравниваются между собой в соответствии с весами, установленными для данной кодировки стандартами
UNICODE
(при этом короткая строка дополняется до длинной пробелами/нулями). -
Результатом сравнения любой строки символов/байт со строкой с неопределенным (NULL) значением всегда будет
FALSE
. -
Строки байт сравниваются в порядке кодов.
-
Строка символов/байт и число не сопоставимы между собой.
create table tab1(c char (10)); insert into tab1 values ('125');
Неправильная конструкция:
select * from tab1 where c >100;
Правильные конструкции:
select * from tab1 where to_number(c) >100; select * from tab1 where c > cast 100 as char; select * from tab1 where c >to_char(100);
-
Типы данных
NCHAR, NCHAR VARYING
задают представление данных в форматеUNICODE
, в котором для представления символа используется шестнадцать бит – два байта данных, обеспечивая, таким образом, уникальные коды для 65536 символов. ПосколькуUNICODE
может представить такое количество различных символов, то он обеспечивает стандартизированные коды для символов, используемых в большинстве языков мира, и, кроме того, может представлять разнообразные дополнительные графические символы (математические, фонетические, торговые и пр.). -
Тип данных
NCHAR
задает UNICODE-строку символов фиксированной длины (максимальная длина Unicode-строки – 4000 байтов, 2000 Unicode-символа). Если реальное количество символов в строке меньше< длины >
, то при записи в БД строка дополняется до заданной< длины >
пробелами справа. Длина значений типаNCHAR
в БД не хранится. При выборке из БД дополнение пробелами до заданной длины не выполняется.create table tab1(n nchar (10)); insert into tab1 values (hex('125745fa768877ad')); select n, length(n) from tab1; |園海衶굷 |4 |
-
Тип данных NCHAR VARYING задает UNICODE-строку символов переменной длины (максимальная длина UNICODE-строки – 4000 байтов, 2000 UNICODE-символа). Если реальное количество символов в строке меньше < длины >, то при записи в БД или при выборке из БД строка не дополняется до заданной < длины > пробелами. Фактическая длина значений типа NCHAR VARCHAR хранится в БД.
create table tab1(vn nchar varying(10)); insert into tab1 values (hex('125745fa768877ad')); select vn, length(vn) from tab1; |園海衶굷 |4 |
-
Для символьных данных, представленных в
UNICODE
, поддерживаются преобразования к верхнему/нижнему регистру. -
При выполнении операции сравнения данные типа
VARCHAR
,VARBYTE
,NCHAR VARYING
дополняются, при необходимости, пробелами (двоичными нулями) для выравнивания длин сравниваемых операндов. -
При сравнении данных типа
CHAR
,VARCHAR
,NCHAR
,NCHAR VARYING
, представленных в разных кодировках, выполняется преобразование к одной кодировке. -
Тип данных
DECIMAL
задает число с фиксированной точкой (целое или дробное) с максимальным масштабом (количество цифр справа от десятичной точки), равным 10, и точностью (максимальное число значащих цифр), равной 30.create table tab1(d1 decimal, d2 numeric); insert into tab1 values (1, 1.); insert into tab1 values (.076, null); insert into tab1 values (99999999999999999999.9999999999,null); insert into tab1 values (-654.0, +67.004); select * from tab1; |1.0 |1.0 | |0.076 |NULL | |99999999999999999999.9999999999 |NULL | |-654.0 |67.004 |
-
Если < точность > и < масштаб > не заданы, по умолчанию принимается: < точность > – 30, < масштаб > – 10.
-
Если задана только точность, то < масштаб > равен 0.
-
Цифры, которые выходят за размер масштаба, все равно хранятся в значении, но не выдаются при выдаче значения (округляются). Т.е. в случае масштаба 0 в БД будут храниться дробные числа, но при выводе они будут округляться до целого.
create table t_d(d decimal(4,2)); ! Значения укладываются в точность и масштаб insert into t_d values (11.11); insert into t_d values (-22.22); ! Превышено число цифр до запятой – ошибка insert into t_d values (111.11); insert into t_d values (-222.22); ! Превышено число цифр после запятой – усечение при выводе insert into t_d values (33.333); insert into t_d values (-44.444); select * from t_d; | 11.11| |-22.22| | 33.33| |-44.44|
Примечание
Тип данных
BIGINT
задает целое число с точностью 19 цифр и нулевым количеством цифр справа от точки – целые числа в диапазоне от -9 223 372 036 854 775 808 до +9 223 372 036 854 775 807.create table tab1(bi bigint);
-
Тип данных
INT
задает целое число с точностью 10 цифр и нулевым количеством цифр справа от точки – целые числа в диапазоне от -2 147 483 648 до +2 147 483 647.create table tab1(i1 int, i2 integer);
-
Тип данных
SMALLINT
задает целое число с точностью 5 цифр и нулевым количеством цифр справа от точки – целые числа в диапазоне от -32 768 до +32 767.create table tab1(si smallint);
-
Тип данных
REAL
задает тип данных приближенного числа с точностью, равной 6.create table tab1(r real); insert into tab1 values (1.); insert into tab1 values (-67.e+6); insert into tab1 values (+00002.E-12); select * from tab1; |1 | |-6.7e+007 | |2e-012 |
-
Тип данных
DOUBLE
задает тип данных приближенного числа с точностью, равной 15.create table tab1(d1 double, d2 double precision); insert into tab1 values (1., null); insert into tab1 values (-67.e+6, 877655.0000000078341); insert into tab1 values (+02.E-34, 5643); select * from tab1; |1 |NULL | |-67000000 |877655.000000008 | |2e-034 |5643 |
-
Максимальное значение по модулю для типа REAL 3.402823466e+38, для типа DOUBLE 1.7976931348623158e+308.
-
Для значений типов REAL и DOUBLE не рекомендуется использовать точное сравнение.
Не рекомендуется:
столбец = константа
Рекомендуется:
столбец BETWEEN константа-точность AND константа+точность
-
В значениях типа
DATE
дата совмещена со временем. Время в дате считается с точностью до тиков (тик – 1/100 часть секунды). -
В СУБД ЛИНТЕР формат хранения значений типа
DATE
позволяет представлять даты в диапазоне от нулевой даты (00.00.0000) до 31.12.9999. -
Значения типа
DATE
допускают операции сравнения между собой и арифметические операции прибавления (вычитания) к полной дате интервала даты (часов, минут, секунд, дней, месяцев или лет). -
Форматы представления типа данных приведены в пункте < литералы >.
create table tab1 (dt date); insert into tab1 values ('28.04.03'); insert into tab1 values ('28.04.03:12:56:45.99'); insert into tab1 values (to_date('10-sep-50')); insert into tab1 values (to_date('12.18.1878', 'mm.dd. yyyy')); select * from tab1; |28.04.2003:00:00:00.00 | |28.04.2003:12:56:45.99 | |10.09.1950:00:00:00.00 | |18.12.1878:00:00:00.00 |
-
Логический тип данных имеет два значения:
TRUE
(истина) иFALSE
(ложь).create table tab1 (l boolean); insert into tab1 values (true); insert into tab1 values ('FALSE'); insert into tab1 values (null); select * from tab1; |TRUE | |FALSE | |NULL |
-
Тип данных
BLOB
задает неструктурированные данные объемом до 2 Гбайт, предназначенные для хранения текстовой, графической и мультимедийной информации (объемные фрагменты текста, музыка, анимация, видеоизображения, графика и т.п.). Для столбца типа BLOB NULL-значение недопустимо (допускается только BLOB-значение нулевой длины).create table tab1 ("Графика" blob, "Музыка" blob, VIDEO blob);
-
Тип данных
EXTFILE
– символьная строка char(511), содержащая ссылку на локальный файл (т.е. файл, расположенный на локальном или сетевом диске и доступный файловой системе компьютера, на котором функционирует СУБД ЛИНТЕР). Значение типа данныхEXTFILE
нельзя записать и/или прочитать явно. Для этого должны использоваться средства полнотекстового доступа к данным (см. документ «Полнотекстовый поиск в базе данных», приложение «Расширения SQL»).create table tab1 ("Слова" extfile, "Музыка" extfile root 'd:\Program Files\Music\shanson'); insert into tab1("Музыка", "Слова") values (ef('music.doc'), ef('text.doc'));