Типы данных
Функция
Определение типов данных.
Спецификация
::=::=::=::=::=::=::=::=::=::=::=::=::=::=::=::=::=::=::=::=Синтаксические правила
-
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 807 до +9 223 372 036 854 775 807.create table tab1(bi bigint);
-
Тип данных
INTзадает целое число с точностью 10 цифр и нулевым количеством цифр справа от точки – целые числа в диапазоне от -2 147 483 647 до +2 147 483 647.create table tab1(i1 int, i2 integer);
-
Тип данных
SMALLINTзадает целое число с точностью 5 цифр и нулевым количеством цифр справа от точки – целые числа в диапазоне от -32 767 до +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'));