Типы данных

Функция

Определение типов данных.

Спецификация

                               
< строковый тип фиксированной длины >::=
{CHAR | CHARACTER} [(длина)]
< строковый тип переменной длины >::=
{CHAR VARYING | CHARACTER VARYING | VARCHAR} (длина)
< байтовый тип фиксированной длины >::=
BYTE | RAW [(длина)]
< байтовый тип переменной длины >::=
{BYTE VARYING | VARBYTE} (длина)
< UNICODE тип фиксированной длины >::=
{NATIONAL CHARACTER | NATIONAL CHAR | NCHAR} [(длина)]
< UNICODE тип переменной длины >::=
{NATIONAL CHARACTER VARYING
| NATIONAL CHAR VARYING
| NCHAR VARYING
| NVARCHAR} (длина)
< точный числовой тип >::=
{DECIMAL | DEC | NUMERIC | NUMBER} [(точность [,масштаб])]
| BIGINT
| {INTEGER | INT}
| SMALLINT
< приближенный числовой тип >::=
{REAL
| {DOUBLE [PRECISION] | FLOAT}
| FLOAT (точность)}
< дата-время тип >::=
DATE
< логический тип >::=
BOOLEAN
< BLOB тип >::=
BLOB | LONG RAW
< внешний файл >::=
{EXTFILE | EF} [ROOT 'каталог']
< точность >::=
< масштаб >::=

Синтаксические правила

  1. CHAR является синонимом CHARACTER.

  2. VARCHAR является синонимом CHAR VARYING, CHARACTER VARYING.

  3. VARBYTE является синонимом BYTE VARYING.

  4. NCHAR является синонимом NATIONAL CHAR, NATIONAL CHARACTER.

  5. NCHAR VARYING является синонимом NATIONAL CHAR VARYING, NATIONAL CHARACTER VARYING, NVARCHAR.

  6. DEC, DECIMAL, NUMERIC и NUMBER являются синонимами.

  7. INT является синонимом INTEGER.

  8. DOUBLE является синонимом DOUBLE PRECISION.

  9. Значение < длины > и < точности > должно быть больше 0.

  10. Если < длина > не задана, по умолчанию принимается значение 1.

  11. Если < масштаб > не задан, по умолчанию принимается значение 0.

Общие правила

  1. Тип данных CHAR задает строку символов фиксированной длины (максимальная длина строки – 4000 байтов). Если реальное количество символов в строке меньше < длины >, то при записи в БД строка дополняется до заданной < длины > пробелами справа и при выборке возвращается с дополненными пробелами.

    Примечание

    Если ядро СУБД запущено с ключом /COMPATIBILITY=STANDARD, то функция length концевые нули учитывает, иначе игнорирует.

    create table tab1(c char(50));
    insert into tab1 values ('1234567890');
    select c, length(c) from tab1;
    |1234567890                                         |50 |
  2. Тип данных 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 символов включительно.

  3. Любой строковый тип данных может иметь значение длины 0.

  4. Столбец как базовой таблицы, так и подзапроса не может иметь значение длины 0.

  5. При выборке константы в SELECT-запросе столбец наследует тип выбираемого выражения. В случае пустой строки этот тип должен быть скорректирован, чтобы длина не была нулевой.

  6. Тип данных 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 |
  7. Тип данных VARBYTE задает строку байт переменной длины (максимальная длина байтовой строки – 4000 байтов). Если реальное количество байт в строке меньше < длины >, то строка не дополняется до заданной < длины > двоичными нулями.

    Примечание

    Независимо от режима запуска ядра СУБД (с ключом или без ключа /COMPATIBILITY=STANDARD) концевые нули всегда усекаются.

    create table tab1(vb varbyte(20));
    insert into tab1 values (hex('12ffca4527'));
    select vb , length(vb) from tab1;
    |12FFCA4527 |5 |
  8. Строка символов/байт состоит из последовательности символов (байт) с кодами от 0 до 255.

  9. Для символьных строк поддерживается преобразование к соответствующей кодировке (русская, латинская, верхний/нижний регистр), байтовые строки независимы от используемой кодовой страницы.

    select lower('НПП "Релэкс"'), upper('НПП "Релэкс"');
    |нпп "релэкс" |НПП "РЕЛЭКС" |
  10. Длина строки, не содержащей символов/байт, равна 0.

  11. Строка символов/байт может иметь неопределенное (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 |
  12. Все строки символов сравниваются между собой в соответствии с весами, установленными для данной кодировки стандартами UNICODE (при этом короткая строка дополняется до длинной пробелами/нулями).

  13. Результатом сравнения любой строки символов/байт со строкой с неопределенным (NULL) значением всегда будет FALSE.

  14. Строки байт сравниваются в порядке кодов.

  15. Строка символов/байт и число не сопоставимы между собой.

    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);
  16. Типы данных NCHAR, NCHAR VARYING задают представление данных в формате UNICODE, в котором для представления символа используется шестнадцать бит – два байта данных, обеспечивая, таким образом, уникальные коды для 65536 символов. Поскольку UNICODE может представить такое количество различных символов, то он обеспечивает стандартизированные коды для символов, используемых в большинстве языков мира, и, кроме того, может представлять разнообразные дополнительные графические символы (математические, фонетические, торговые и пр.).

  17. Тип данных 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 |
  18. Тип данных 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 |
  19. Для символьных данных, представленных в UNICODE, поддерживаются преобразования к верхнему/нижнему регистру.

  20. При выполнении операции сравнения данные типа VARCHAR, VARBYTE, NCHAR VARYING дополняются, при необходимости, пробелами (двоичными нулями) для выравнивания длин сравниваемых операндов.

  21. При сравнении данных типа CHAR, VARCHAR, NCHAR, NCHAR VARYING, представленных в разных кодировках, выполняется преобразование к одной кодировке.

  22. Тип данных 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       |
  23. Если < точность > и < масштаб > не заданы, по умолчанию принимается: < точность > – 30, < масштаб > – 10.

  24. Если задана только точность, то < масштаб > равен 0.

  25. Цифры, которые выходят за размер масштаба, все равно хранятся в значении, но не выдаются при выдаче значения (округляются). Т.е. в случае масштаба 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);
  26. Тип данных INT задает целое число с точностью 10 цифр и нулевым количеством цифр справа от точки – целые числа в диапазоне от -2 147 483 648 до +2 147 483 647.

    create table tab1(i1 int, i2 integer);
  27. Тип данных SMALLINT задает целое число с точностью 5 цифр и нулевым количеством цифр справа от точки – целые числа в диапазоне от -32 768 до +32 767.

    create table tab1(si smallint);
  28. Тип данных 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    |
  29. Тип данных 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             |
  30. Максимальное значение по модулю для типа REAL 3.402823466e+38, для типа DOUBLE 1.7976931348623158e+308.

  31. Для значений типов REAL и DOUBLE не рекомендуется использовать точное сравнение.
    Не рекомендуется:
    столбец = константа
    Рекомендуется:
    столбец BETWEEN константа-точность AND константа+точность

  32. В значениях типа DATE дата совмещена со временем. Время в дате считается с точностью до тиков (тик – 1/100 часть секунды).

  33. В СУБД ЛИНТЕР формат хранения значений типа DATE позволяет представлять даты в диапазоне от нулевой даты (00.00.0000) до 31.12.9999.

  34. Значения типа DATE допускают операции сравнения между собой и арифметические операции прибавления (вычитания) к полной дате интервала даты (часов, минут, секунд, дней, месяцев или лет).

  35. Форматы представления типа данных приведены в пункте < литералы >.

    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  |
  36. Логический тип данных имеет два значения: 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  |
  37. Тип данных BLOB задает неструктурированные данные объемом до 2 Гбайт, предназначенные для хранения текстовой, графической и мультимедийной информации (объемные фрагменты текста, музыка, анимация, видеоизображения, графика и т.п.). Для столбца типа BLOB NULL-значение недопустимо (допускается только BLOB-значение нулевой длины).

    create table tab1 ("Графика" blob, "Музыка" blob, VIDEO blob);
  38. Тип данных 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'));