Основы языка Transact-SQL. Основные элементы Transact-SQL. Типы данных MS SQL Server. Выражения Transact-SQL, страница 2

Типы данных СУБД MS SQL Server делятся на 7 категорий, приведенных в таблице:

20

21

Приведенные типы данных служат для определения постоянных и временных таблиц, табличных и нетабличных переменных. В некоторых объектах MS SQL Server (хранимых процедурах, триггерах, функциях) можно использовать не все типы данных.

22

3.1. Точные числовые типы данных Точные числовые типы данных (см. таблицу) используют для хранения чисел, как с десятичными точками, так и без них. К таким числам можно применять любые математические операции – никакая специальная обработка для этого не нужна. Объем памяти, занимаемой такими числами, строго определен и не зависит от архитектуры процессора (Intel, AMD).

24

25

Типы данных numeric и decimal принимают параметры, уточняющие определение типа данных. Эти параметры задают точность и масштаб типа данных. Например, decimal(12,4) определяет десятичное значение, которое может содержать до 12 разрядов, причем 4 из них – после запятой.

26

Самые распространенные типы данных из этой категории – int и decimal. Тип данных decimal можно (но не рекомендуется) использовать и для хранения целочисленных значений, так как при этом для каждой строки потребуются дополнительные байты.

3.2. Приближенные числовые типы данных

28

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

29

Например, если для хранения значения 1.00015454 используется тип данных float(8), при запросе столбец гарантированно вернет лишь значение 1.000154 (хранится в точности 7 разрядов, а разряды ниже седьмого приведут к ошибкам округления).

Поэтому вычисления, использующие приближенные типы данных, содержат ошибки округления. Перемещение БД с таблицами, содержащими эти типы данных, между платформами Intel и AMD также приведет к ошибкам.

Тип данных float используется редко (когда хранимые значения выходят за пределы диапазонов точных числовых типов данных).

3.3 Денежные типы данных

32

Денежные типы данных созданы для хранения денежных значений с 4 десятичными разрядами после запятой. При необходимости выполнять расчеты с большей точностью вместо денежных типов данных используется тип decimal.

3.4. Типы данных «Дата и время»

34

В SQL Server 2005 (и «младше») дату и время можно хранить только вместе. Например, 2008-09-23 14:17:29.154 - значение системного времени для 23 сентября 2008 г. 14 часов 17 минут 29 секунд 154 миллисекунды. Поэтому для использования кратких форматов даты (без часов, минут, секунд) в БД требуется выполнять дополнительные преобразования значений даты.

35

Для внутреннего хранения типов данных datetime и smalldatetime используют целочисленные значения. Тип данных datetime хранится в виде пары четырехбайтовых целых значений, которые в совокупности равны числу миллисекунд, прошедших с полуночи 1.01.1753 г. (в первых четырех байтах хранится дата, а во вторых четырех байтах – время).

36

Тип данных smalldatetime хранится в виде пары двухбайтовых целых значений, которые в совокупности равны числу минут, прошедших с полуночи 1.01.1900 г. (в первых двух байтах хранится дата, а во вторых двух байтах – время).

3.5. Символьные типы данных

Служат для хранения символьных данных. В этих типах данных один символ занимает в памяти 1 или 2 байта в зависимости от используемой кодировки – ANSI или Unicode. Названия типов данных Unicode начинаются с буквы n. Например, nchar в Unicode является аналогом типа данных char в ANSI.

38

При определении символьного типа данных указывается максимальное количество байтов (не символов!), которое можно хранить в столбце. Например: char(10) служит для хранения не более 10 символов (для хранения каждого символа при кодировке ANSI нужен 1 байт), nchar(10) позволяет хранить не более 5 символов (для хранения одного символа при кодировке Unicode нужно 2 байта).

40

41