2008 г.
Базы данных. Вводный курс
Сергей Кузнецов
Назад Содержание Вперёд 15.2. Типы данных SQL
Данные, хранящиеся в столбцах таблиц SQL-ориентированной базы данных, являются типизированными, т. е. представляют собой значения одного из типов данных, предопределенных в языке SQL или определяемых пользователями путем применения соответствующих средств языка. Для этого при определении таблицы каждому ее столбцу назначается некоторый тип данных (или домен), и в дальнейшем СУБД должна следить, чтобы в каждом столбце каждой строки каждой таблицы присутствовали только допустимые значения. В этом разделе мы обсудим систему типов языка SQL.
Все допустимые в SQL типы данных, которые можно использовать при определении столбцов73), разбиваются на следующие категории74):
- точные числовые типы (exact numerics);
- приближенные числовые типы (approximate numerics);
- типы символьных строк (character strings);
- типы битовых строк (bit strings)75);
- типы даты и времени (datetimes);
- типы временных интервалов (intervals);
- булевский тип (Booleans);
- типы коллекций (collection types);
- анонимные строчные типы (anonymous row types);
- типы, определяемые пользователем (user-defined types);
- ссылочные типы (reference types).
В столбцах таблиц, определенных на любых типах данных, наряду со значениями этих типов, допускается сохранение неопределенного значения, которое обозначается ключевым словом NULL . В языке определено, что результатом выражений вида x a_op NULL , NULL a_op x , NULL a_op NULL является NULL для всех арифметических операций a_op (+ , - и т. д.), допустимых для типа данных выражения x (выражение NULL a_op NULL является допустимым для любой арифметической операции a_op ). Также по определению полагается, что значением выражений x comp_op NULL , NULL comp_op x , NULL comp_op NULL для всех операций сравнения (= , , > , < и т. д.), определенных для типа выражения x , является третье логическое значение unknown 76) (выражение NULL comp_op NULL является допустимым для любой операции сравнения comp_op ).
15.2.1. Tочные числовые типы
К категории точных числовых типов в SQL относятся те типы, значения которых точно представляют числа. Типы данных этой категории распадаются на две части: истинно целые типы (INTEGER и SMALLINT ) и типы, допускающие наличие дробной части (NUMERIC и DECIMAL ). Охарактеризуем эти типы данных более подробно.
Истинно целые типы
- Тип
INTEGER служит для представления целых чисел. Точность чисел (число сохраняемых бит) определяется в реализации. При определении столбца данного типа достаточно указать просто INTEGER . - Тип
SMALLINT также служит для представления целых чисел. Точность определяется в реализации, но она не должна быть больше точности типа INTEGER . При определении столбца указывается просто SMALLINT .77) - Литералы типов целых чисел представляются в виде строк символов, изображающих десятичные числа; в начале строки могут присутствовать символы «
+ » или «- » (если символ знака отсутствует, подразумевается «+ »). Примеры литералов типов INTEGER и SMALLINT : 1826545 , 876 .
Точные типы, допускающие наличие дробной части
- Тип
NUMERIC . На самом деле, это не просто тип данных, а параметризуемый тип. При определении столбца можно указать спецификацию NUMERIC (p, s) , где p и s – литералы истинно целого типа, и p задает точность значений (число сохраняемых бит), а s – шкалу (число десятичных цифр в дробной части). Задаваемая шкала не должна быть отрицательной и не должна превышать значение точности. При определении столбца можно использовать сокращенные формы спецификации типа – NUMERIC и NUMERIC (p) . Первая форма предполагает использование точности, определяемое по умолчанию в реализации, и шкалы, равной нулю, а вторая – использование заданной точности и шкалы, равной нулю. Допустимые диапазоны значений p и s определяются в реализации. - Тип
DECIMAL . Этот тип аналогичен типу NUMERIC . Отличие состоит в том, что если при определении столбца типа DECIMAL задается точность p , то на самом деле используется точность m , определяемая в реализации, такая, что m > p . Шкала всегда устанавливается такой, как явно или неявно (по умолчанию) задается. При указании типа столбца можно использовать спецификации DECIMAL , DECIMAL (p) и DECIMAL (p, s) . - Литералы типов точных чисел, допускающих наличие дробной части, представляются в виде строк символов, изображающих десятичные числа, в начале которых могут присутствовать символы «
+ » или «- » (если символ знака отсутствует, подразумевается «+ »), а внутри последовательности цифр может присутствовать символ «. ». Примеры литералов типов NUMERIC и DECIMAL : 125 , 26.36 .
15.2.2. Приближенные числовые типы
К категории приближенных числовых типов в SQL относятся те типы, значения которых представляют числа приближенным образом. Приближенные числа представляются в виде пары <мантисса, порядок>, где мантисса состоит из значащих цифр числа, а порядок определяет реальный размер числа. В реализациях приближенным числовым типам SQL обычно соответствуют типы с плавающей точкой. В SQL поддерживаются три варианта приближенных числовых типов.
- Тип
REAL . Значения типа соответствуют числам с плавающей точкой одинарной точности. Точность определяется в реализации, но обычно совпадает с точностью одинарной плавающей арифметики, поддерживаемой на аппаратной платформе, которая используется реализацией. При определении столбца указывается просто REAL . - Тип
DOUBLE PRECISION . Точность значений этого типа определяется в реализации, но она должна быть больше точности типа REAL . Обычно приближенным числам SQL с двойной точностью соответствуют поддерживаемые аппаратурой числа с плавающей точкой двойной точности. При определении столбца указывается просто DOUBLE PRECISION . - Тип
FLOAT . Это параметризуемый тип, значение параметра p которого задает необходимую точность значений. Требуется, чтобы реально обеспечиваемая реализацией точность значений была не меньше p . Допустимый диапазон значений параметра p определяется в реализации. При определении столбца можно указать либо FLOAT (p) , либо просто FLOAT . В последнем случае подразумевается точность, определяемая реализацией по умолчанию. - Литералы приближенных числовых типов представляются в виде литерала точного числового типа, за которым могут следовать символ «
E » и литерал целого числового типа. Примеры литералов приближенных числовых типов: 123 , 123.12 , 123E12 , 123.12E12 . Литеральное выражение xEy представляет значение x*(10y) .
15.2.3. Типы символьных строк
В SQL определены три параметризуемых типа символьных строк: CHARACTER (или CHAR ), CHARACTER VARYING (или CHAR VARYING , или VARCHAR ) и CHARACTER LARGE OBJECT (или CLOB ).78)
- Тип
CHARACTER . Значениями типа являются символьные строки. Конкретный набор допустимых символов определяется в реализации, но, как правило, включает набор символов ASCII. При определении столбца допускается использование спецификаций CHARACTER (x) и просто CHARACTER . Последний вариант эквивалентен заданию CHARACTER (1) . После определения столбца типа CHARACTER (x) СУБД будет резервировать место для хранения x символов этого столбца во всех строках соответствующей таблицы. Если, например, определен столбец типа CHARACTER (8) , и в некоторой строке таблицы в него заносится символьная строка длиной пять символов, то реально будут храниться восемь символов, последние три из которых будут пробелами79). - Тип
CHARACTER VARYING . При определении столбца допускается использование спецификаций CHARACTER VARYING (x) и просто CHARACTER VARYING . Последний вариант эквивалентен заданию CHARACTER VARYING (1) . Если в некоторой таблице определяется столбец типа CHARACTER VARYING (x) , то в каждой строке этой таблицы значения данного столбца будут занимать ровно столько места, сколько требуется для сохранения соответствующей символьной строки (но ни одна такая строка не может состоять более чем из x символов).80) - Определен ряд операций, которые можно выполнять над символьными строками. Перечислим некоторые из них.
- Операция конкатенации (обозначается в виде «
|| ») возвращает символьную строку, произведенную путем соединения строк-операндов в том порядке, в каком они заданы. - Функция выделения подстроки (
SUBSTRING ) принимает три аргумента – строку, номер начальной позиции и длину – и возвращает строку, выделенную из строки-аргумента в соответствии со значениями двух последних параметров. - Функция
UPPER возвращает строку, в которой все строчные буквы строки-аргумента заменяются прописными. Функция LOWER , наоборот, заменяет в заданной строке все прописные буквы строчными. - Функция определения длины (
CHARACTER_LENGTH , OCTET_LENGTH , BIT_LENGTH ) возвращает длину заданной символьной строки в символах, октетах или битах (в зависимости от вида вычисляющей функции) в виде целого числа. - Функция определения позиции (
POSITION ) определяет первую позицию в строке S , с которой в нее входит заданная строка S1 (если не входит, то возвращается значение нуль).
- Тип
CHARACTER LARGE OBJECT . Этот тип данных предназначен для определения столбцов, хранящих большие и разные по размеру группы символов. При определении столбца задается спецификация CLOB (z) , где z задает максимальный размер соответствующей группы символов. Максимально возможное значение параметра z определяется в реализации, но, очевидно, что оно должно быть существенно больше максимально возможного значения параметра x , присутствующего в типах CHAR и CHAR VARYING .81) - Литералы типов символьных строк представляются в виде последовательностей символов, заключенных в одинарные или двойные кавычки. В первом случае среди набора символов литерала допускается наличие символов двойной кавычки, а во втором – символов одинарной кавычки. Примеры литералов символьных строк:
’ABCDEF’ , ’Ab"Ctd’ , "Fbcdef" , "ab’cdtF" .
15.2.4. Типы битовых строк
В SQL определены три параметризуемых типа битовых строк: BIT , BIT VARYING и BINARY LARGE OBJECT (или BLOB ).
- Тип
BIT . Значениями типа являются битовые строки. При определении столбца допускается использование спецификаций BIT (x) и просто BIT . Последний вариант эквивалентен заданию BIT (1) . После определения столбца типа BIT (x) СУБД будет резервировать место для хранения x бит этого столбца во всех строках соответствующей таблицы. - Тип
BIT VARYING . При определении столбца допускается использование только спецификации без умолчания вида BIT VARYING (x) , где значение x определяет максимальную длину битовой строки, которую можно хранить в данном столбце. - Над битовыми строками определен ряд операций. Некоторые из них мы рассмотрим.
- Битовая конкатенация (обозначается в виде
|| ), которая возвращает результирующую битовую строку, полученную путем конкатенации строк-аргументов в том порядке, в котором они заданы. - Функция извлечения подстроки из битовой строки. Синтаксис и семантика этой функции идентичны синтаксису и семантике функции
SUBSTRING для символьных строк, за исключением того, что первый аргумент и возвращаемое значение являются битовыми строками. - Функция определения длины (
OCTET_LENGTH , BIT_LENGTH ) возвращает длину заданной битовой строки в октетах или битах в зависимости от выбранной функции. - Функция определения позиции (
POSITION ) определяет первую позицию в битовой строке S , с которой в нее входит строка S1 . Если строка S1 не входит в строку S , возвращается значение нуль.
- Тип
BINARY LARGE OBJECT . Этот тип данных предназначен для определения столбцов, хранящих большие и разные по размеру группы байтов. При определении столбца задается спецификация BLOB (z) , где z задает максимальный размер соответствующей группы байтов. С технической точки зрения типы CLOB и BLOB очень похожи. Их разделение требуется для того, чтобы подчеркнуть, что значения типа CLOB состоят из символов (в частности, в них может осмысленно производиться текстовый поиск), а значения типа BLOB состоят из произвольных байтов, не обязательно кодирующих символы. - Литералы типов битовых строк представляются как заключенные в одинарные кавычки последовательности символов «
0 » и «1 », предваряемые символом «B »; или предваряемые символом «X » последовательности символов, которые изображают шестнадцатеричные цифры (за цифрой «9 » следуют «A », «B », «C », «D », «E » и «F »). Примеры литералов типов битовых строк: B’0111001111000111111111’ , X’78FBCD0012FFFFA’ .82)
73 А также переменных, параметров и других типизированных объектов языка SQL, которые мы не затрагиваем в этом курсе.
74 В этот список не включен тип данных XML, поскольку в данном курсе вообще не рассматриваются проблемы управления базами XML-данных.
75 Спецификация предопределенного типа данных битовых строк была удалена в стандарте SQL:2003. Но поскольку эта спецификация появилась только в SQL:1999, мы сочли уместным оставить в курсе обсуждение этого типа данных.
76 См. ниже Булевский тип.
77 Следует подчеркнуть, что в стандарте SQL не определяется число байт, занимаемых при хранении в памяти значений целых типов. Не следует думать, что в SQL для хранения значения типа INTEGER требуется четыре байта, а SMALLINT требует двух байтов.
78 В контексте локализации SQL-ориентированной СУБД (средства локализации входят в стандарт языка) можно определить еще три типа символьных строк – NATIONAL CHARACTER , NATIONAL CHARACTER VARYING и NATIONAL CHARACTER LARGE OBJECT . Аспекты интернационализации и локализации составляют отдельное измерение языка и не обсуждаются в данном курсе.
79 Именно пробелами, а не «пустыми» символами!
80 Максимально допустимая длина строк постоянного и переменного размера (значение параметра x ) определяется в реализации.
81 Поскольку значения z могут быть очень большими, допускается сокращенная форма их задания в виде nK , nM и nG , где n – положительное целое число, а K , M и G означают кило, мега и гига соответственно.
82 В литерале BLOB всегда должно содержаться четное число шестнадцатиричных цифр.
Назад Содержание Вперёд
|
|