Язык SQL Типы данных SQL Типы данных. SQL: Типы данных
Последнее обновление: 12.07.2017
При создании таблицы для всех ее столбцов необходимо указать определенный тип данных. Тип данных определяет, какие значения могут храниться в столбце, сколько они будут занимать места в памяти.
Язык T-SQL предоставляет множество различных типов. В зависимости от характера значений все их можно разделить на группы.
Числовые типы данных
BIT : хранит значение 0 или 1. Фактически является аналогом булевого типа в языках программирования. Занимает 1 байт.
TINYINT : хранит числа от 0 до 255. Занимает 1 байт. Хорошо подходит для хранения небольших чисел.
SMALLINT : хранит числа от –32 768 до 32 767. Занимает 2 байта
INT : хранит числа от –2 147 483 648 до 2 147 483 647. Занимает 4 байта. Наиболее используемый тип для хранения чисел.
BIGINT : хранит очень большие числа от -9 223 372 036 854 775 808 до 9 223 372 036 854 775 807, которые занимают в памяти 8 байт.
DECIMAL : хранит числа c фиксированной точностью. Занимает от 5 до 17 байт в зависимости от количества чисел после запятой.
Данный тип может принимать два параметра precision и scale: DECIMAL(precision, scale) .
Параметр precision представляет максимальное количество цифр, которые может хранить число. Это значение должно находиться в диапазоне от 1 до 38. По умолчанию оно равно 18.
Параметр scale представляет максимальное количество цифр, которые может содержать число после запятой. Это значение должно находиться в диапазоне от 0 до значения параметра precision. По умолчанию оно равно 0.
NUMERIC : данный тип аналогичен типу DECIMAL.
SMALLMONEY : хранит дробные значения от -214 748.3648 до 214 748.3647. Предназначено для хранения денежных величин. Занимает 4 байта. Эквивалентен типу DECIMAL(10,4) .
MONEY : хранит дробные значения от -922 337 203 685 477.5808 до 922 337 203 685 477.5807. Представляет денежные величины и занимает 8 байт. Эквивалентен типу DECIMAL(19,4) .
FLOAT : хранит числа от –1.79E+308 до 1.79E+308. Занимает от 4 до 8 байт в зависимости от дробной части.
Может иметь форму опредеения в виде FLOAT(n) , где n представляет число бит, которые используются для хранения десятичной части числа (мантиссы). По умолчанию n = 53.
REAL : хранит числа от –340E+38 to 3.40E+38. Занимает 4 байта. Эквивалентен типу FLOAT(24) .
Типы данных, представляющие дату и время
DATE : хранит даты от 0001-01-01 (1 января 0001 года) до 9999-12-31 (31 декабря 9999 года). Занимает 3 байта.
TIME : хранит время в диапазоне от 00:00:00.0000000 до 23:59:59.9999999. Занимает от 3 до 5 байт.
Может иметь форму TIME(n) , где n представляет количество цифр от 0 до 7 в дробной части секунд.
DATETIME : хранит даты и время от 01/01/1753 до 31/12/9999. Занимает 8 байт.
DATETIME2 : хранит даты и время в диапазоне от 01/01/0001 00:00:00.0000000 до 31/12/9999 23:59:59.9999999. Занимает от 6 до 8 байт в зависимости от точности времени.
Может иметь форму DATETIME2(n) , где n представляет количество цифр от 0 до 7 в дробной части секунд.
SMALLDATETIME : хранит даты и время в диапазоне от 01/01/1900 до 06/06/2079, то есть ближайшие даты. Занимает от 4 байта.
DATETIMEOFFSET : хранит даты и время в диапазоне от 0001-01-01 до 9999-12-31. Сохраняет детальную информацию о времени с точностью до 100 наносекунд. Занимает 10 байт.
Распространенные форматы дат:
yyyy-mm-dd - 2017-07-12
dd/mm/yyyy - 12/07/2017
mm-dd-yy - 07-12-17
В таком формате двузначные числа от 00 до 49 воспринимаются как даты в диапазоне 2000-2049. А числа от 50 до 90 как диапазон чисел 1950 - 1999.
Month dd, yyyy - July 12, 2017
Распространенные форматы времени:
hh:mi am/pm - 1:21 pm
hh:mi:ss - 1:21:34
hh:mi:ss:mmm - 1:21:34:12
hh:mi:ss:nnnnnnn - 1:21:34:1234567
Строковые типы данных
CHAR : хранит строку длиной от 1 до 8 000 символов. На каждый символ выделяет по 1 байту. Не подходит для многих языков, так как хранит символы не в кодировке Unicode.
Количество символов, которое может хранить столбец, передается в скобках. Например, для столбца с типом CHAR(10) будет выделено 10 байт. И если мы сохраним в столбце строку менее 10 символов, то она будет дополнена пробелами.
VARCHAR : хранит строку. На каждый символ выделяется 1 байт. Можно указать конкретную длину для столбца - от 1 до 8 000 символов, например, VARCHAR(10) . Если строка должна иметь больше 8000 символов, то задается размер MAX, а на хранение строки может выделяться до 2 Гб: VARCHAR(MAX) .
Не подходит для многих языков, так как хранит символы не в кодировке Unicode.
В отличие от типа CHAR если в столбец с типом VARCHAR(10) будет сохранена строка в 5 символов, то в столце будет сохранено именно пять символов.
NCHAR : хранит строку в кодировке Unicode длиной от 1 до 4 000 символов. На каждый символ выделяется 2 байта. Например, NCHAR(15)
NVARCHAR : хранит строку в кодировке Unicode. На каждый символ выделяется 2 байта.Можно задать конкретный размер от 1 до 4 000 символов: . Если строка должна иметь больше 4000 символов, то задается размер MAX, а на хранение строки может выделяться до 2 Гб.
Еще два типа TEXT и NTEXT являются устаревшими и поэтому их не рекомендуется использовать. Вместо них применяются VARCHAR и NVARCHAR соответственно.
Примеры определения строковых столбцов:
Email VARCHAR(30), Comment NVARCHAR(MAX)
Бинарные типы данных
BINARY : хранит бинарные данные в виде последовательности от 1 до 8 000 байт.
VARBINARY : хранит бинарные данные в виде последовательности от 1 до 8 000 байт, либо до 2^31–1 байт при использовании значения MAX (VARBINARY(MAX)).
Еще один бинарный тип - тип IMAGE является устаревшим, и вместо него рекомендуется применять тип VARBINARY.
Остальные типы данных
UNIQUEIDENTIFIER : уникальный идентификатор GUID (по сути строка с уникальным значением), который занимает 16 байт.
TIMESTAMP : некоторое число, которое хранит номер версии строки в таблице. Занимает 8 байт.
CURSOR : представляет набор строк.
HIERARCHYID : представляет позицию в иерархии.
SQL_VARIANT : может хранить данные любого другого типа данных T-SQL.
XML : хранит документы XML или фрагменты документов XML. Занимает в памяти до 2 Гб.
TABLE : представляет определение таблицы.
GEOGRAPHY : хранит географические данные, такие как широта и долгота.
GEOMETRY : хранит координаты местонахождения на плоскости.
1.1. Символьные типы
1) Строки постоянной длины
CHAR()
– строка текста в формате, определенном разработчиком. Натуральное число задает строки.
На практике максимальное число символов бывает в диапазоне от 256 в MS SQL Server до 32767 в InterBase.
CHAR трактуется как CHAR(1)
2) Строки переменной длины
VARCHAR|CHAR VARYING [()]
– строка текста переменной длины в формате, определенном разработчиком. Натуральное число задает максимальную строки, но в таблице отводится место только под реальную длину строки.
3) Особенности символьных типов ряда СУБД
В ряде СУБД, например, MS SQL Server, если CHAR допускает значение NULL, то от трактуется как VARCHAR.
В Oracle для полей типа VARCHAR2 можно зарезервировать в каждом блоке место для будущих обновлений поля, определив опцию PCTFREE.
1.2. Числовые типы
1) Целые типы данных
INT
– число без десятичной точки. Размер зависит от конкретного варианта реализации. Часто это 4 байта.
SMALLINT
– совпадает с INT, но обычно меньше по размеру. Часто 2 байта.
BIGINT
– совпадает с INT, но обычно больше по размеру. Это 4 или более байта.
2) Вещественные числа с фиксированной точкой
DEC|)]
– десятичное число с фиксированной точкой.
Число имеет:
— общее число значащих десятичных разрядов,
— максимальное количество разрядов справа от десятичной точки.
3) Вещественные числа с плавающей точкой
FLOAT
– число с плавающей точкой, представленное в экспоненциальной форме по основанию 10. Задается максимальная точность.
REAL
– совпадает с FLOAT, но точность зависит от варианта реализации.
DOUBE
– совпадает с REAL, но точность может быть больше в конкретной реализации.
1.3. Даты и типы времени
DATE
– дата в формате yyyy-mm-dd (ISO), mm/dd/yyyy (ANSI).
TIME
– время в формате hh.mm.ss (ISO), hh:mm am/pm (ANSI).
INTERVAL
– дата и время в формате yyyy-mm-dd-hh.mm.ss.nnnnn (ISO). (часто TIMESTAMP).
Примечание:
Типы даты и времени могут задаваться в виде строковых литералов.
Дата: ‘yyyy-mm-dd’, время: ‘hh.mm.ss’,
Интервал: ‘yyyy-mm-dd-hh.mm.ss.n…n’.
1.4. Логический тип
BOOLEAN
– логическое значение (TRUE, FALSE, UNKNOWN).
Для правильного понимания таблицы истинности в трехзначной логике (3VL) можно условно считать, что FALSE — 0, TRUE -1, а UNKNOWN – 0.5.
Тогда:
— Оператор AND возвращает наименьшее.
— Оператор OR – наибольшее из исходных значений.
— NOT UNKNOWN = UNKNOWN.
2. Коллекции
Коллекции фактически нарушают первую нормальную форму (1NF).
2.1. Массив
[()] ARRAY – набор однотипных значений.
Примечание:
Массивы были введены в SQL:99.
Пример:
Так, определение WeekDays Varchar(10) ARRAY позволяет хранить название всех семи дней недели в одном поле.
Ряд СУБД допускают даже многомерные массивы. Так в InterBase возможно до 16 изменений, Clarion – 4.
2.2. Мультимножество
[()] MULTISET
– неограниченный набор однотипных значений, допускающий дубликаты.
Значения создаются конструктором – специальными функциями.
Примечание:
Мультимножества были введены в SQL:2003.
2.3. Анонимный строковый тип
ROW ([()] , …)
– набор разнотипных значений, включая вложенные.
Опции могут задавать порядок сортировки полей строкового типа и ряд других установок.
Пример:
Так, определив Address ROW(State Char(6), City Varchar(30), Street Varchar(50)) позволяет хранить подробный адрес в одном поле.
3. Типы LOB
CLOB (Character Large Object)
– ведут себя во многом подобно символьным строкам, но их запрещено использовать:
— В ограничениях Primary Key, Unique, Foreign Key.
— В сравнениях, отличных от чистых равенств или неравенств, в разделах Order By и Group By.
BLOB (Binary Large Object)
– поток байт в формате, в котором пользователь сможет их записать в колонку БД.
3.1. Проблемы использования LOB
1) Проблемы хранения
Хранение LOB прямо в таблицах вместе с другими данными нарушает работу оптимизатора, основанную на использовании страниц данных, размер которых соответствует размеру дисковых страниц.
Поэтому LOB хранятся в отдельных областях (сегментах) дисковой памяти.
2) Проблемы обновления
Поскольку размер LOB объектов может достигать десятков и сотен мегабайт, то их невозможно хранить в буферах целиком. Поэтому данные типа LOB обрабатываются по частям, например, группами страниц. В операторах INSERT и UPDATE для обработки по частям используются специальные технологии, позволяющие многократно вызывать одну и ту же API-функцию для одного поля. Аналогично и при считывании данных операторами SELECT и FETCH.
3) Проблемы выполнения транзакций
Для поддержки транзакций большинство СУБД ведет журнал транзакций, в котором записываются копии данных до и после модификаций.
Однако из-за больших размеров LOB не записываются в журнал.
4) Проблемы пересылки по сети
Часто клиент и сервер работают на разных компьютерах, и пересылка LOB по сети может прервать работу всех, кто пользуется сетью в данных момент.
4. Разные типы
4.1. Locator
Уникальное двоичное (четырехбитное) значение (в ООП – дескриптор), сохраняемое в БД.
Описывается в главной программе и действует до конца транзакции.
Предназначен для манипуляции LOB-значениями (или массивами) на стороне клиента. Вместо LOB клиенту посылается ссылка на него.
Можно объявить: LOC: Integer AS LOCATOR.
4.2. XML
Значениями, по существу, являются XML-документы.
Для этого типа определяется ряд операций, обеспечивающих доступ к элементам значения типа XML, преобразования подобных данных и т.п.
4.3. Datalink
Datalinks являются частью SQL/MED 9075-9:2003.
Datalink представляет собой особый тип SQL предназначен для хранения URL-адресов в БД, а также ряд функций, которые могут быть использованы в SQL запросах.
С особенностями и поддерживаемыми функциями можно ознакомится на сайте:
Wiki.postgresql.org/wiki/DATALINK
Используются в DB2, Oracle – для хранения данных во внешнем файле BFile.
Типы данных SQL.
Описание | ||
Строковые типы |
Строка символов постоянной длины |
CHAR (количество_символов) |
Строка символов переменной длины |
VARCHAR (количество_символов) |
|
Большая строка символов переменной длины | ||
Большой двоичный объект переменной | ||
Числовые точные типы |
Целое число | |
Целое число. Количество разрядов больше или равно INTEGER | ||
Целое число. Количество разрядов меньше или равно INTEGER | ||
Число с фиксированной запятой (количество_разрядов – общее число знаков, масштаб - знаков после запятой) |
{NUMERIC | DECIMAL | DEC} (кол-во разрядов, масштаб) |
|
Числовые неточные типы |
Число с плавающей запятой | |
Число с плавающей запятой. Количество разрядов больше или равно REAL |
DOUBLE PRECISION |
|
Число с плавающей запятой |
FLOAT (кол-во разрядов) |
|
Временные типы |
Дата. Содержит год, месяц и день | |
Временная отметка. Содержит год, месяц, день, час, минуты и секунды |
TIMESTAMP (масштаб) |
|
Время. Содержит час, минуты и секунды (масштаб - количество знаков в дробной части секунд). Возможно указание временной зоны |
TIME (масштаб) |
|
Временной промежуток. | ||
Логический тип |
Принимает логические значения |
Литералы
Литералы – это простейшие выражения, являющиеся значениями соответствующих типов. Каждый тип данных имеет способ представления литералов своего типа. В SQL имеются следующие литералы:
символьных строк (пример: "Символьная строка"),
двоичных строк (пример: X"1AFFD561"),
чисел (примеры: 27 -863 0.173 .8582 -9572.5619 11.54Е7 .94Е194 93Е-12 -29.629Е27),
временные (DATE "2005-12-07" TIME "HH:MI:SS" TIMESTAMP "YYYY-MM-DD HH:MI:SS"),
логические (TRUE, FALSE, UNKNOWN).
Операторы и выражения
Операторы - это конструкции языка, указывающие операции над элементами данных и возвращающие в качестве результата новое значение. Элементы данных, используемые в операторах, называются операндами или аргументами. Операторы представляются в виде специальных символов или ключевых слов. Например, оператор умножения представляется звездочкой (*), а оператор проверки на неопределенное значение - ключевым словом IS NULL.
Есть два основных вида операторов. Унарные имеют только один операнд и обычно представляются в следующем формате:
операнд оператор
Бинарные оперируют двумя операндами и представляются таким образом:
операнд оператор операнд
Кроме того, существуют специальные операторы, использующие более двух операндов. Тип оператора определяется типом используемых аргументов и типом возвращаемого результата. Имеются операторы следующих типов:
строковые (||);
арифметические;
логические;
предикаты сравнения;
специальные предикаты;
операторы над множествами (таблицами).