1 added
1 removed
Original
2026-01-01
Modified
2026-03-10
1
<ul><li><a>Несколько слов о T-SQL</a></li>
1
<ul><li><a>Несколько слов о T-SQL</a></li>
2
<li><a>Типы данных (data types)</a><ul><li><a>Числовые типы данных</a></li>
2
<li><a>Типы данных (data types)</a><ul><li><a>Числовые типы данных</a></li>
3
<li><a>Тип данных для времени</a></li>
3
<li><a>Тип данных для времени</a></li>
4
<li><a>Строковый тип данных</a></li>
4
<li><a>Строковый тип данных</a></li>
5
<li><a>О бинарных типах данных</a></li>
5
<li><a>О бинарных типах данных</a></li>
6
<li><a>Специальные типы данных</a></li>
6
<li><a>Специальные типы данных</a></li>
7
</ul></li>
7
</ul></li>
8
</ul><p>Согласно процедурному расширению языка<strong>SQL</strong>(Transact-SQL), для работы с MS SQL Server предусмотрены различные типы данных. Конкретный тип данных указывается для любого столбца во время создания таблицы и определяет, какие именно значения можно будет хранить, а также сколько места в памяти компьютера они будут занимать. Эта статья представляет собой<strong>обзор существующих типов данных</strong>для MS SQL Server, которые, в зависимости от поддерживаемых значений, делятся на группы.</p>
8
</ul><p>Согласно процедурному расширению языка<strong>SQL</strong>(Transact-SQL), для работы с MS SQL Server предусмотрены различные типы данных. Конкретный тип данных указывается для любого столбца во время создания таблицы и определяет, какие именно значения можно будет хранить, а также сколько места в памяти компьютера они будут занимать. Эта статья представляет собой<strong>обзор существующих типов данных</strong>для MS SQL Server, которые, в зависимости от поддерживаемых значений, делятся на группы.</p>
9
<p><strong>Transact-SQL</strong> является процедурным расширением SQL (structured query language), которое создано корпорацией Microsoft специально для баз данных Microsoft SQL Server и Sybase ASE. Известный язык программирования SQL был расширен рядом<strong>дополнительных возможностей</strong>:</p>
9
<p><strong>Transact-SQL</strong> является процедурным расширением SQL (structured query language), которое создано корпорацией Microsoft специально для баз данных Microsoft SQL Server и Sybase ASE. Известный язык программирования SQL был расширен рядом<strong>дополнительных возможностей</strong>:</p>
10
<ul><li>управляющими операторами,</li>
10
<ul><li>управляющими операторами,</li>
11
<li>локальными и глобальными переменными,</li>
11
<li>локальными и глобальными переменными,</li>
12
<li>вспомогательными функциями для обработки строк, дат и пр.,</li>
12
<li>вспомогательными функциями для обработки строк, дат и пр.,</li>
13
<li>поддержкой аутентификации Microsoft Windows.</li>
13
<li>поддержкой аутентификации Microsoft Windows.</li>
14
</ul><p>Сегодня язык Transact-SQL - это, по сути,<strong>ключ</strong>к применению MS SQL Server. Таким образом, все программные приложения, взаимодействующие с экземпляром MS SQL Server, вне зависимости от реализации и UI, выполняют отправку серверу инструкций Transact-SQL.</p>
14
</ul><p>Сегодня язык Transact-SQL - это, по сути,<strong>ключ</strong>к применению MS SQL Server. Таким образом, все программные приложения, взаимодействующие с экземпляром MS SQL Server, вне зависимости от реализации и UI, выполняют отправку серверу инструкций Transact-SQL.</p>
15
<p>Директивами сценария являются специфические команды, используемые лишь в MS SQL. Такие команды позволяют серверу определять правила работы с транзакциями и<a>скриптом</a>.</p>
15
<p>Директивами сценария являются специфические команды, используемые лишь в MS SQL. Такие команды позволяют серверу определять правила работы с транзакциями и<a>скриптом</a>.</p>
16
<h2><strong>Типы данных (</strong><strong>data</strong><strong></strong><strong>types</strong><strong>)</strong></h2>
16
<h2><strong>Типы данных (</strong><strong>data</strong><strong></strong><strong>types</strong><strong>)</strong></h2>
17
<p>Как это принято и в других языках программирования, язык T-SQL поддерживает множество разных типов данных, используемых для хранения переменных в MS SQL. Эти типы данных можно разделить на группы:</p>
17
<p>Как это принято и в других языках программирования, язык T-SQL поддерживает множество разных типов данных, используемых для хранения переменных в MS SQL. Эти типы данных можно разделить на группы:</p>
18
<ul><li><strong>числовые</strong>. Служат для хранения числовых переменных;</li>
18
<ul><li><strong>числовые</strong>. Служат для хранения числовых переменных;</li>
19
<li><strong>типы данных для дат</strong>. Обеспечивают хранение значений времени и даты;</li>
19
<li><strong>типы данных для дат</strong>. Обеспечивают хранение значений времени и даты;</li>
20
<li><strong>символьный</strong>. Нужен для символьных типов данных;</li>
20
<li><strong>символьный</strong>. Нужен для символьных типов данных;</li>
21
<li><strong>двоичные</strong>. Обеспечивают хранение бинарных типов данных;</li>
21
<li><strong>двоичные</strong>. Обеспечивают хранение бинарных типов данных;</li>
22
<li><strong>большого объема</strong>. Этот тип данных (data type) нужен для хранения больших бинарных значений;</li>
22
<li><strong>большого объема</strong>. Этот тип данных (data type) нужен для хранения больших бинарных значений;</li>
23
<li><strong>специальные</strong>. Сюда входит широкий спектр типов данных: указатели, таблицы и пр.</li>
23
<li><strong>специальные</strong>. Сюда входит широкий спектр типов данных: указатели, таблицы и пр.</li>
24
</ul><p>Давайте рассмотрим некоторые из вышеописанных типов данных подробнее.</p>
24
</ul><p>Давайте рассмотрим некоторые из вышеописанных типов данных подробнее.</p>
25
<h3><strong>Числовые типы данных</strong></h3>
25
<h3><strong>Числовые типы данных</strong></h3>
26
<p>К числовым типам данных относят:</p>
26
<p>К числовым типам данных относят:</p>
27
<ul><li><strong>BIT</strong>: может храниться 0 либо 1. По сути, это аналог булевого типа в программировании. Занимает всего один байт;</li>
27
<ul><li><strong>BIT</strong>: может храниться 0 либо 1. По сути, это аналог булевого типа в программировании. Занимает всего один байт;</li>
28
<li><strong>TINYINT</strong>: хранит целые числа в пределах 0-255. Тоже занимает 1 байт и часто используется в целях хранения небольших чисел;</li>
28
<li><strong>TINYINT</strong>: хранит целые числа в пределах 0-255. Тоже занимает 1 байт и часто используется в целях хранения небольших чисел;</li>
29
<li><strong>SMALLINT</strong>: сохраняет числа в пределах от -32 768 до 32 767. Занимает уже 2 байта;</li>
29
<li><strong>SMALLINT</strong>: сохраняет числа в пределах от -32 768 до 32 767. Занимает уже 2 байта;</li>
30
<li><strong><a>INT</a></strong>: диапазон хранения - от -2 147 483 648 до 2 147 483 647. 4 байта. Тип данных int чаще всего применяется для сохранения числовых значений;</li>
30
<li><strong><a>INT</a></strong>: диапазон хранения - от -2 147 483 648 до 2 147 483 647. 4 байта. Тип данных int чаще всего применяется для сохранения числовых значений;</li>
31
<li><strong>BIGINT</strong>: предназначен для очень больших значений (от -9 223 372 036 854 775 808 до 9 223 372 036 854 775 807) и занимает в памяти 8 байт;</li>
31
<li><strong>BIGINT</strong>: предназначен для очень больших значений (от -9 223 372 036 854 775 808 до 9 223 372 036 854 775 807) и занимает в памяти 8 байт;</li>
32
<li><strong>DECIMAL</strong>: для хранения переменных c фиксированной точностью. В зависимости от количества чисел после запятой переменная типа Decimal может занимать от 5 до 17 байт.</li>
32
<li><strong>DECIMAL</strong>: для хранения переменных c фиксированной точностью. В зависимости от количества чисел после запятой переменная типа Decimal может занимать от 5 до 17 байт.</li>
33
</ul><p>Также этот тип данных способен принимать 2 параметра - scale и precision: <em>DECIMAL(precision, scale)</em>.</p>
33
</ul><p>Также этот тип данных способен принимать 2 параметра - scale и precision: <em>DECIMAL(precision, scale)</em>.</p>
34
<p>Параметр precision служит для представления наибольшего количества цифр, способных хранить числовое значение. По дефолту оно равняется 18-ти, а вообще должно располагаться в диапазоне 1-38.</p>
34
<p>Параметр precision служит для представления наибольшего количества цифр, способных хранить числовое значение. По дефолту оно равняется 18-ти, а вообще должно располагаться в диапазоне 1-38.</p>
35
<p>Параметр scale служит для представления максимального количества цифр, которые способно содержать число после запятой. Такое значение должно быть в диапазоне от 0 до значения, которое указывается параметром precision. По умолчанию равно нулю;</p>
35
<p>Параметр scale служит для представления максимального количества цифр, которые способно содержать число после запятой. Такое значение должно быть в диапазоне от 0 до значения, которое указывается параметром precision. По умолчанию равно нулю;</p>
36
<ul><li><strong>NUMERIC</strong>: этот тип данных аналогичен предыдущему;</li>
36
<ul><li><strong>NUMERIC</strong>: этот тип данных аналогичен предыдущему;</li>
37
<li><strong>SMALLMONEY</strong>: сохраняет дробные значения в пределах от -214 748.3648 до 214 748.3647. Служит для хранения денежных величин. Эквивалентен DECIMAL(10,4), занимает 4 байта;</li>
37
<li><strong>SMALLMONEY</strong>: сохраняет дробные значения в пределах от -214 748.3648 до 214 748.3647. Служит для хранения денежных величин. Эквивалентен DECIMAL(10,4), занимает 4 байта;</li>
38
<li><strong>MONEY</strong>: сохраняет дробные значения в диапазоне от -922 337 203 685 477.5808 до 922 337 203 685 477.5807. Служит для представления денежных величин, занимает 8 байт. Соответствует DECIMAL(19,4).</li>
38
<li><strong>MONEY</strong>: сохраняет дробные значения в диапазоне от -922 337 203 685 477.5808 до 922 337 203 685 477.5807. Служит для представления денежных величин, занимает 8 байт. Соответствует DECIMAL(19,4).</li>
39
<li><strong>FLOAT</strong>: для хранения значений от -1.79E+308 до 1.79E+308. В зависимости от дробной части может занимать от 4 до 8 байт.</li>
39
<li><strong>FLOAT</strong>: для хранения значений от -1.79E+308 до 1.79E+308. В зависимости от дробной части может занимать от 4 до 8 байт.</li>
40
</ul><p>Этот тип данных способен иметь форму определения в формате FLOAT(n), где n - это количество бит, используемых в целях хранения десятичной части числа (речь идет о мантиссе). По дефолту n равняется 53;</p>
40
</ul><p>Этот тип данных способен иметь форму определения в формате FLOAT(n), где n - это количество бит, используемых в целях хранения десятичной части числа (речь идет о мантиссе). По дефолту n равняется 53;</p>
41
<ul><li><strong>REAL</strong>: сохраняет числа в диапазоне от -340E+38 to 3.40E+38. Соответствует FLOAT(24), занимает 4 байта.</li>
41
<ul><li><strong>REAL</strong>: сохраняет числа в диапазоне от -340E+38 to 3.40E+38. Соответствует FLOAT(24), занимает 4 байта.</li>
42
</ul><p>Рассмотрим пример числового столбца с таким типом данных:</p>
42
</ul><p>Рассмотрим пример числового столбца с таким типом данных:</p>
43
<h3><strong>Тип данных для времени</strong></h3>
43
<h3><strong>Тип данных для времени</strong></h3>
44
<p>Существуют типы данных, предназначенных для отображения даты и времени:</p>
44
<p>Существуют типы данных, предназначенных для отображения даты и времени:</p>
45
<ul><li><strong>DATE</strong>: сохраняет даты, начиная с 1 января 0001 года (0001-01-01), заканчивая 31 декабрём 9999 г. (9999-12-31). Занимает 3 байта;</li>
45
<ul><li><strong>DATE</strong>: сохраняет даты, начиная с 1 января 0001 года (0001-01-01), заканчивая 31 декабрём 9999 г. (9999-12-31). Занимает 3 байта;</li>
46
<li><strong>TIME</strong>: сохраняет время в диапазоне 00:00:00.0000000 - 23:59:59.9999999. Способен иметь форму TIME(n), причем n здесь представляет число цифр от 0 до 7 в дробной части секунд. Занимает 3-5 байт;</li>
46
<li><strong>TIME</strong>: сохраняет время в диапазоне 00:00:00.0000000 - 23:59:59.9999999. Способен иметь форму TIME(n), причем n здесь представляет число цифр от 0 до 7 в дробной части секунд. Занимает 3-5 байт;</li>
47
</ul><ul><li><strong>DATETIME</strong>: обеспечивает сохранение объектов даты и времени в диапазоне 01/01/1753 - 31/12/9999. 8 байт;</li>
47
</ul><ul><li><strong>DATETIME</strong>: обеспечивает сохранение объектов даты и времени в диапазоне 01/01/1753 - 31/12/9999. 8 байт;</li>
48
<li><strong>DATETIME2</strong>: сохраняет дату и время в диапазоне 01/01/0001 00:00:00.0000000 - 31/12/9999 23:59:59.9999999. Может занимать 6-8 байт, что зависит от временной точности. Способен иметь форму DATETIME2(n), причем n здесь - это число цифр в пределах 0-7 в дробной части секунд;</li>
48
<li><strong>DATETIME2</strong>: сохраняет дату и время в диапазоне 01/01/0001 00:00:00.0000000 - 31/12/9999 23:59:59.9999999. Может занимать 6-8 байт, что зависит от временной точности. Способен иметь форму DATETIME2(n), причем n здесь - это число цифр в пределах 0-7 в дробной части секунд;</li>
49
</ul><ul><li><strong>SMALLDATETIME</strong>: сохраняет даты и время в пределах 01/01/1900-06/06/2079, то есть речь идет о ближайших датах. 4 байта;</li>
49
</ul><ul><li><strong>SMALLDATETIME</strong>: сохраняет даты и время в пределах 01/01/1900-06/06/2079, то есть речь идет о ближайших датах. 4 байта;</li>
50
<li><strong>DATETIMEOFFSET</strong>: для дат и времени в диапазоне от 0001-01-01 до 9999-12-31. Обеспечивается сохранение детальной информации о времени, точность составляет 100 наносекунд. 10 байт;</li>
50
<li><strong>DATETIMEOFFSET</strong>: для дат и времени в диапазоне от 0001-01-01 до 9999-12-31. Обеспечивается сохранение детальной информации о времени, точность составляет 100 наносекунд. 10 байт;</li>
51
</ul><p>Наиболее распространены следующие форматы дат:</p>
51
</ul><p>Наиболее распространены следующие форматы дат:</p>
52
<p>В этом формате 2-значные числа в пределах 00-49 воспринимаются в качестве дат диапазона 2000-2049. А числовые значения 50-99 воспринимаются в качестве диапазона 1950-1999.</p>
52
<p>В этом формате 2-значные числа в пределах 00-49 воспринимаются в качестве дат диапазона 2000-2049. А числовые значения 50-99 воспринимаются в качестве диапазона 1950-1999.</p>
53
<p>Распространены следующие временные форматы:</p>
53
<p>Распространены следующие временные форматы:</p>
54
<h3><strong>Строковый тип данных</strong></h3>
54
<h3><strong>Строковый тип данных</strong></h3>
55
<p>Какие строковые типы данных бывают:</p>
55
<p>Какие строковые типы данных бывают:</p>
56
<ul><li><strong>CHAR</strong>: для строк длиной 1-8000 символов. На каждый символ выделяется 1 байт. Этот тип данных не подходит для многих языков, а все потому, что он сохраняет символы не в кодировке Unicode.</li>
56
<ul><li><strong>CHAR</strong>: для строк длиной 1-8000 символов. На каждый символ выделяется 1 байт. Этот тип данных не подходит для многих языков, а все потому, что он сохраняет символы не в кодировке Unicode.</li>
57
</ul><p>Число символов, которое способен хранить столбец, передается с помощью скобок. К примеру, для столбца CHAR(10) выделится 10 байт. Когда мы сохраняем в столбце строку размером меньше десяти символов, она дополнится пробелами;</p>
57
</ul><p>Число символов, которое способен хранить столбец, передается с помощью скобок. К примеру, для столбца CHAR(10) выделится 10 байт. Когда мы сохраняем в столбце строку размером меньше десяти символов, она дополнится пробелами;</p>
58
<ul><li><strong>VARCHAR</strong>: может хранить строки, причем здесь тоже на каждый символ происходит выделение 1 байта. Для столбца можно указать определенную длину в диапазоне 1-8 000 символов, к примеру, VARCHAR(10). Когда строка должна иметь более 8000 символов, задается размер MAX, причем на хранение строки может выделять до 2 Гб: VARCHAR(MAX).</li>
58
<ul><li><strong>VARCHAR</strong>: может хранить строки, причем здесь тоже на каждый символ происходит выделение 1 байта. Для столбца можно указать определенную длину в диапазоне 1-8 000 символов, к примеру, VARCHAR(10). Когда строка должна иметь более 8000 символов, задается размер MAX, причем на хранение строки может выделять до 2 Гб: VARCHAR(MAX).</li>
59
</ul><p>Этот тип данных также не подходит для многих языков и все по той же причине: хранит символы не в Unicode;</p>
59
</ul><p>Этот тип данных также не подходит для многих языков и все по той же причине: хранит символы не в Unicode;</p>
60
<ul><li><strong>NCHAR</strong>: для строки с кодировкой Unicode и длиной 1-4 000 символов. На каждый символ - 2 байта;</li>
60
<ul><li><strong>NCHAR</strong>: для строки с кодировкой Unicode и длиной 1-4 000 символов. На каждый символ - 2 байта;</li>
61
<li><strong>NVARCHAR</strong>: сохраняет строку в Unicode. На каждый символ - 2 байта. Есть возможность задать конкретный размер в пределах 1-4 000 символов. Когда строка должна включать более 4000 символов, задается размер MAX, а на хранение строки выделяется до 2 Гб.</li>
61
<li><strong>NVARCHAR</strong>: сохраняет строку в Unicode. На каждый символ - 2 байта. Есть возможность задать конкретный размер в пределах 1-4 000 символов. Когда строка должна включать более 4000 символов, задается размер MAX, а на хранение строки выделяется до 2 Гб.</li>
62
-
</ul><p>Также существуют такие типы данных, как<strong>TEXT</strong> и <strong>NTEXT</strong>. Они считаются устаревшими, поэтому их лучше не использовать. Вместо только что упомянутых типов данных применяют VARCHAR и NVARCHAR.</p>
62
+
</ul><p>Также существуют такие типы данных, как<strong>TEXT</strong> и <strong>NTEXT</strong>. Они считаются устаревшими, поэтому их лучше не и��пользовать. Вместо только что упомянутых типов данных применяют VARCHAR и NVARCHAR.</p>
63
<p>Рассмотрим примеры определения строковых столбцов:</p>
63
<p>Рассмотрим примеры определения строковых столбцов:</p>
64
<h3><strong>О бинарных типах данных</strong></h3>
64
<h3><strong>О бинарных типах данных</strong></h3>
65
<p>Пришла очередь и двоичным данным:</p>
65
<p>Пришла очередь и двоичным данным:</p>
66
<ul><li><strong>BINARY</strong>: для сохранения бинарных типов данных в качестве последовательности в пределах 1-8 000 байт;</li>
66
<ul><li><strong>BINARY</strong>: для сохранения бинарных типов данных в качестве последовательности в пределах 1-8 000 байт;</li>
67
<li><strong>VARBINARY</strong>: для хранения бинарных типов данных в качестве последовательности в диапазоне 1-8 000 байт, либо до 2^31-1 байт в случае применения значения MAX (VARBINARY(MAX)).</li>
67
<li><strong>VARBINARY</strong>: для хранения бинарных типов данных в качестве последовательности в диапазоне 1-8 000 байт, либо до 2^31-1 байт в случае применения значения MAX (VARBINARY(MAX)).</li>
68
</ul><p>Такой бинарный тип, как IMAGE, тоже устарел, поэтому вместо него желательно использовать тип данных VARBINARY.</p>
68
</ul><p>Такой бинарный тип, как IMAGE, тоже устарел, поэтому вместо него желательно использовать тип данных VARBINARY.</p>
69
<h3><strong>Специальные типы данных</strong></h3>
69
<h3><strong>Специальные типы данных</strong></h3>
70
<p>В этой группе перечислим оставшиеся типы данных:</p>
70
<p>В этой группе перечислим оставшиеся типы данных:</p>
71
<ul><li><strong>UNIQUEIDENTIFIER</strong>: уникальный идентификатор GUID (строка с уникальным значением), занимающий 16 байт;</li>
71
<ul><li><strong>UNIQUEIDENTIFIER</strong>: уникальный идентификатор GUID (строка с уникальным значением), занимающий 16 байт;</li>
72
<li><strong>TIMESTAMP</strong>: некоторое число, хранящее номер версии строки в таблице. Может занимать 8 байт;</li>
72
<li><strong>TIMESTAMP</strong>: некоторое число, хранящее номер версии строки в таблице. Может занимать 8 байт;</li>
73
<li><strong>CURSOR</strong>: для набора строк;</li>
73
<li><strong>CURSOR</strong>: для набора строк;</li>
74
<li><strong>HIERARCHYID</strong>: для представления позиции в иерархии;</li>
74
<li><strong>HIERARCHYID</strong>: для представления позиции в иерархии;</li>
75
<li><strong>SQL_VARIANT</strong>: для хранения значений практически любого другого типа данных T-SQL;</li>
75
<li><strong>SQL_VARIANT</strong>: для хранения значений практически любого другого типа данных T-SQL;</li>
76
<li><strong>XML</strong>: для хранения документов XML либо фрагментов XML-документов. Занимает до двух гигабайт;</li>
76
<li><strong>XML</strong>: для хранения документов XML либо фрагментов XML-документов. Занимает до двух гигабайт;</li>
77
<li><strong>TABLE</strong>: представляет определение таблицы;</li>
77
<li><strong>TABLE</strong>: представляет определение таблицы;</li>
78
<li><strong>GEOGRAPHY</strong>: обеспечивает хранение географических данных (широты, долготы);</li>
78
<li><strong>GEOGRAPHY</strong>: обеспечивает хранение географических данных (широты, долготы);</li>
79
<li><strong>GEOMETRY</strong>: для координат местонахождения на плоскости.</li>
79
<li><strong>GEOMETRY</strong>: для координат местонахождения на плоскости.</li>
80
</ul><p><em>Примечание</em>: для работы с русскими символами тип данных применяют, используя приставку "n" (nchar, nvarchar, ntext). Такие приставки кодируют символы 2-мя байтами. Если говорить иными словами, то для работы с кодировкой Unicode используют тип данных с "n" (вспоминаем слово national). Так же записываются и строковые константы.</p>
80
</ul><p><em>Примечание</em>: для работы с русскими символами тип данных применяют, используя приставку "n" (nchar, nvarchar, ntext). Такие приставки кодируют символы 2-мя байтами. Если говорить иными словами, то для работы с кодировкой Unicode используют тип данных с "n" (вспоминаем слово national). Так же записываются и строковые константы.</p>
81
<p>Когда речь идет о типе данных для значения переменной длины, задействуют тип данных, имеющий приставку "var" (character varying). Тип данных без приставки "var" характеризуется фиксированной длиной области памяти, причем неиспользованная часть заполняется пробелами либо нулями.</p>
81
<p>Когда речь идет о типе данных для значения переменной длины, задействуют тип данных, имеющий приставку "var" (character varying). Тип данных без приставки "var" характеризуется фиксированной длиной области памяти, причем неиспользованная часть заполняется пробелами либо нулями.</p>
82
<p><em>По материалам:</em></p>
82
<p><em>По материалам:</em></p>
83
<p><em>- https://metanit.com/sql/sqlserver/3.3.php;</em></p>
83
<p><em>- https://metanit.com/sql/sqlserver/3.3.php;</em></p>
84
<p><em>- https://ru.wikipedia.org/wiki/Transact-SQL.</em></p>
84
<p><em>- https://ru.wikipedia.org/wiki/Transact-SQL.</em></p>
85
<a></a>
85
<a></a>