Определение типов данных
После создания базы данных следует построить таблицы для хранения данных. Однако для этого сначала необходимо определить тип данных, который вы зададите для каждого столбца. Тип данных — это атрибут, который определяет, какого типа данные могут хранить столбец, параметр или переменная. SQL Server поддерживает набор системных типов данных, а также пользовательские типы, которые основаны на системных типах данных.
Системные типы данных
В SQL Server с каждым столбцом связан какой-либо тип данных, который является атрибутом, определяющим тип информации (целочисленная, символьная, денежная и т д.) в этом столбце. С некоторыми объектами, отличными от столбцов, тоже ассоциирован тип данных. Тип данных имеется у следующих объектов:
• столбцов таблиц и представлений;
• параметров хранимых процедур;
• переменных;
• функций Transact-SQL, которые возвращают одно или несколько значений определенного типа;
• хранимых процедур, у которых имеется код возврата (для него всегда действителен только целочисленный тип данных).
Один из первых этапов конструирования таблицы — назначение каждому ее столбцу типа данных. SQL Server поддерживает набор системных типов данных, которые определяют все типы данных, разрешенные к использованию в SQL Server. Эти типы позволяют обеспечивать целостность данных, поскольку вводимые или изменяемые данные столбца должны соответствовать типу, изначально заданному в операторе CREATE TABLE. Например, нельзя хранить фамилию в столбце, для которого определен тип данных datetime, поскольку в такой столбец можно ввести только допустимые даты.
При назначении объекту типа данных определяются четыре атрибута этого объекта:
• вид данных, которые могут содержаться в объекте — например, символьные, целочисленные или двоичные;
• длина или размер хранимого значения — длина типов данных image, binary и varbinary определяется в байтах. Длина любого числового типа данных — это число байт, необходимое для хранения числа знаков, разрешенного для этого типа данных. Длина символьных типов данных, в том числе в кодировке Unicode, определяется в символах;
• точность числа (только для числовых типов данных) — количество знаков, которыми представлено число. Например, объект типа smallint может хранить не более пяти знаков, поэтому его точность равна пяти;
• точность дробной части числа (только для числовых типов данных) — количество десятичных знаков после запятой. Например, у объекта типа int нет дробной части, поэтому точность его дробной части равна нулю. У объекта типа money может быть до четырех знаков после запятой, поэтому точность его дробной части равна четырем.
В следующей таблице указаны категории типов данных, поддерживаемых SQL Server, а также описания базовых типов данных, которые входят в каждую категорию.
Категория типа данных | Описание | Базовый тип данных | Описание |
Двоичные | Двоичные данные, хранящие строки бит. Данные состоят из шестнадцатеричных чисел. Например, десятичное число 244 соответствует шестнадцатеричному F4 | binary | Данные одинакового фиксированного размера {до 8 кб) |
varbinary | Данные с различным числом шестнадцатеричных знаков (до 8 кб) | ||
image | Данные переменной длины, размер которых превышает 8 кб | ||
Символьные | Символьные данные, состоящие из любых комбинаций букв, символов и цифр, Например, комбинации “1kuku2” и “<0*&(%B99nhjkJ” считаются допустимыми символьными данными | char | У данных должен быть один и тот же фиксированный размер (до 8 кб} |
varchar | Число символов может быть различно, но общая длина не должна превышать 8 кб | ||
text | Данные из ASCII-символов, размер может превышать 8 кб | ||
Дата и время | Данные, состоящие из допустимых комбинаций времени даты. Не существует отдельных типов данных для хранения только времени или только даты | datetime | Даты из диапазона I января 1753 г. — 31 декабря 9999 г. (для хранения одного значения требуется 8 байт) |
smalldatetime | Даты из диапазона 1 января 1900 г. — 6 июня 2079 г. (для хранения одного значения требуется 4 байта) | ||
Десятичные | Данные, которые сохраняются до наименьшего значащего разряда | decimal | Данные длиной до 38 знаков, все знаки могут относиться к дробной части. Этот тип данных хранит точное, а не приближенное представление числа |
numeric | В SQL Server этот тип данных является эквивалентом decimal | ||
С плавающей запятой | Приближенные числовые данные (с плавающей запятой), точность определяется возможностями двоичной системы счисления | float | Числа из интервала от -1.79Е+308 до 1,79Е+308 |
real | Числа с плавающей запятой из интервала от ‑3.40Е+38 до 3.40Е+38 | ||
Целочисленные | Целочисленные данные, состоящие из отрицательных и положительных целых чисел | bigint | Числа из интервала от ‑2^63 до 2^63-1 Размер — 8 байт |
int | Число из интервала от ‑2147483648 до 2147483647 (для хранения необходимо по 4 байта на одно значение) | ||
smallint | Только числа из интервала от ‑32768 до 32767 (для хранения необходимо по 2 байта на одно значение) | ||
tinyint | Только числа из интервала 0 — 255 (для хранения необходимо по 1 байту на одно значение) | ||
Денежные | Финансовые данные, представляют положительные или отрицательные денежные суммы | money | Суммы от ‑922337203685477,5808 до +922337203685477,5807 (для хранения требуется 8 байт) |
smallmoney | Денежная сумма из интервала от ‑234748,3648 до 214748,3647 (для хранения требуется 4 байта) | ||
Специальные | Специальные данные, не попадающие ни в одну другую категорию данных | bit | Данные, состоящие из пар 1 и 0. Используются для представления пар TRUE и FALSE, а также YES и NO |
cursor | Этот тип данных используется для переменных и выходных параметров хранимых процедур, которые содержат ссылку на курсор. Любые переменные с этим типом данных допускают пустые значения | ||
timestamp | Данные этого типа используются для указания последовательности выполнения SQL Server операций над строками. Представлены возрастающим числом в двоичном формате | ||
uniquedentifier | Данные, состоящие из 16-байтовых шестнадцатеричных чисел, указывающие глобально уникальный идентификатор (GUID). С помощью GUID можно сделать строку уникальной, т. е. отличающейся от множества других | ||
SQL_variant | Могут хранить значения любых поддерживаемых SQL Server типов, кроме text, ntext, timestamp, image и sql_variant | ||
table | Этот тип используется для хранения результирующего набора, предназначенного для дальнейшей обработки. Может использоваться только для определения локальных переменных типа table или в качестве типа значения, возвращаемого пользовательской функцией | ||
Unicode | С помощью типов данных Unicode можно хранить в столбцах любые символы, определенные стандартом Unicode, куда входят все символы, определенные в разнообразных наборах символов. Для хранения типов данных Unicode требуется в два раза больше места по сравнению с типами, отличными от Unicode | nchar | Данные, имеющие одинаковый фиксированный размер (до 4000 символов Unicode) |
nvarchar | Данные, состоящие из различного числа символов Unicode (до 4000) | ||
ntext | Данные, размер которых превышает 4000 символов Unicode |
Помимо перечисленных базовых типов допускается использование типа xml, который предназначен хранения данных в формате XML.
Все данные, которые хранятся в SQL Server, должны быть совместимы с одним из вышеперечисленных базовых типов. Cursor — это единственный тип данных, который нельзя назначить столбцу таблицы. Его используют только для переменных и параметров хранимых процедур.
У некоторых базовых типов данных есть синонимы (например, rowversion — это синоним timestamp, a national character varying — синоним nvarchar).
Пользовательские типы данных
В основе пользовательских типов данных лежат системные типы данных SQL Server. Пользовательские типы данных применяются, когда в наборе столбцов из нескольких таблиц должны храниться однотипные данные, причем они должны гарантированно иметь одинаковый тип, размер и по одному и тому же правилу допускать или не допускать пустые значения. Например, на основе типа char можно создать пользовательский тип данных под названием postal_code.
Для создания пользовательского типа данных необходимо предоставить следующую информацию:
• имя;
• системный тип данных, лежащий в основе нового типа данных;
• возможность ввода пустых значений (допускает ли новый тип данных пустые значения);
Если возможность нулевых значений не определена явно, она задается на основе параметра по умолчанию (ANSI null) для базы данных или соединения.
Если пользовательский тип данных создан в базе данных Model, он появится во всех новых пользовательских базах данных. Однако если новый тип данных создан в пользовательской базе данных, он будет существовать только в ней.
Пользовательские типы данных создаются посредством системной хранимой процедуры sp_addtype или SQL Server Management Studio.