MS SQL Server и T-SQL
Последнее обновление: 12.07.2017
При создании таблицы для всех ее столбцов необходимо указать определенный тип данных. Тип данных определяет, какие значения могут храниться в столбце, сколько они будут занимать места в памяти.
Язык T-SQL предоставляет множество различных типов. В зависимости от характера значений все их можно разделить на группы.
Числовые типы данных
BIT: хранит значение от 0 до 16. Может выступать аналогом булевого типа в языках программирования (в этом случае значению true соответствует 1, а значению false — 0). При значениях до 8 (включительно) занимает 1 байт, при значениях от 9 до 16 — 2 байта.
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 байт. Эквивалентен типу
.FLOAT: хранит числа от –1.79E+308 до 1.79E+308. Занимает от 4 до 8 байт в зависимости от дробной части.
Может иметь форму опредеения в виде
FLOAT(n)
, где n представляет число бит, которые используются для хранения десятичной части числа (мантиссы). По умолчанию n = 53.REAL: хранит числа от –340E+38 to 3.40E+38. Занимает 4 байта. Эквивалентен типу
FLOAT(24)
.
Salary MONEY, TotalWeight DECIMAL(9,2), Age INT, Surplus FLOAT
Типы данных, представляющие дату и время
DATE: хранит даты от 0001-01-01 (1 января 0001 года) до 9999-12-31 (31 декабря 9999 года).
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 до 99 как диапазон чисел 1950 — 1999.
Month dd, yyyy
—July 12, 2017
Распространенные форматы времени:
hh:mi
—13:21
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)
VARCHAR(MAX)
.Не подходит для многих языков, так как хранит символы не в кодировке Unicode.
В отличие от типа CHAR если в столбец с типом
VARCHAR(10)
будет сохранена строка в 5 символов, то в столце будет сохранено именно пять символов.NCHAR: хранит строку в кодировке Unicode длиной от 1 до 4 000 символов.
Еще один бинарный тип — тип IMAGE является устаревшим, и вместо него рекомендуется применять тип VARBINARY.
Остальные типы данных
UNIQUEIDENTIFIER: уникальный идентификатор GUID (по сути строка с уникальным значением), который занимает 16 байт.
TIMESTAMP: некоторое число, которое хранит номер версии строки в таблице. Занимает 8 байт.
CURSOR: представляет набор строк.
HIERARCHYID: представляет позицию в иерархии.
SQL_VARIANT: может хранить данные любого другого типа данных T-SQL.
XML: хранит документы XML или фрагменты документов XML. Занимает в памяти до 2 Гб.
TABLE: представляет определение таблицы.
GEOGRAPHY: хранит географические данные, такие как широта и долгота.
GEOMETRY: хранит координаты местонахождения на плоскости.
НазадСодержаниеВперед
INT против BIGINT в SQL Server с примерами
SQL Server предоставляет данные int, bigint, smallint и tinyint для хранения данных с точными числами. В этой статье мы сосредоточимся на типах данных int и bigint.
Введение
Типы данных SQL Server определяют тип данных, которые могут храниться в таблице: целочисленные данные, символьные данные, денежные данные, данные о дате и времени, двоичные строки и т. д. Каждая таблица имеет столбцы, и каждый столбец должен иметь имя и связанный с ним тип данных. SQL Server предоставляет список типов системных данных, определяющий все типы данных, которые можно использовать с SQL Server. Если вашему приложению требуется пользовательский тип данных, вы также можете создать свой тип данных в Transact-SQL или Microsoft .Net Framework. В этой статье мы сравним тип данных int и bigint.
Иногда вам может потребоваться сравнить два выражения с разными типами данных, параметрами сортировки, точностью, масштабом или длиной, которые объединены оператором.
К результатам применяются правила приоритета типа данных перед входными типами данных в выражениях. Сортировка результата основана на правилах приоритета сортировки и применима к типу данных результата char, varchar, text, nchar, nvarchar или ntext. Точность, масштаб и длина результата зависят от точности, масштаба и длины входных выражений. SQL Server предоставляет различные категории типов данных: точные числа, строки символов Unicode, приблизительные числа, двоичные строки.
Дата и время, строки символов и другие типы данных. При работе с числовым типом данных важно понимать тип данных int и bigint.
При разработке базы данных SQL Server важно знать различные типы данных, доступные для использования в Microsoft SQL Server. Тип данных, по сути, является ограничением, означающим, что выбранный вами тип данных ограничивает типы значений, которые вы можете хранить. Например, вы не должны хранить возраст человека в таком типе данных, как BIGINT, потому что он используется для хранения больших чисел. Разработчик SQL должен знать важность типа данных int и bigint. Различные типы данных требуют разного размера хранилища для хранения данных, поэтому важно выбрать правильный тип данных для ваших данных.
SQL Server предоставляет данные int, bigint, smallint и tinyint для хранения данных с точными числами. В этой статье мы сосредоточимся на типах данных int и bigint.
ИНТ
Целочисленный тип данных является наиболее часто используемым типом данных, доступным в SQL Server. Итак, важно понимать тип данных Int. Тип данных int находится посередине среди целочисленных типов данных. Это не самый большой и не самый маленький тип. Вот почему это приемлемо во многих сценариях.
Давайте создадим пример таблицы, используя тип данных int:
СОЗДАТЬ ТАБЛИЦУ EMPLOYEE_SALARY (EMP_ID INT, SALARY INT)
|
В приведенном выше примере мы создаем таблицу EMPLOYEE_SALARY с двумя столбцами EMP_ID и SALARY. Теперь давайте вставим образец записи в таблицу:
ВСТАВИТЬ В EMPLOYEE_SALARY (EMP_ID, SALARY) SELECT 123, 5500
|
Выберите запись из таблицы:
ВЫБРАТЬ * ИЗ EMPLOYEE_SALARY
|
Диапазон типов данных INT: от -2 147 483 648 до 2 147 483 647. Это наиболее подходящий тип данных для хранения целых чисел в большинстве случаев использования.
Целочисленные данные используют 4 байта памяти для хранения. Мы можем проверить это с помощью функции DATALENGTH:
DECLARE @i INT SET @i=100 PRINT DATALENGTH(@i)
|
В приведенном выше примере мы объявили переменную I с целочисленным типом данных, присвоили переменной значение 100, а затем распечатали длину переменной с помощью функции длины данных. Мы получили значение 4 из сообщений печати, поэтому данные int используют 4 байта памяти для хранения.
БОЛЬШОЙ
В предыдущем разделе мы обсудили целочисленные типы данных. Теперь поговорим о типах данных bigint. Чтобы вы могли понять тип данных int vs bigint. Если вам нужно хранить очень большие числа, то тип данных bigint — правильный вариант. Тип данных может хранить большие числа до 9 квинтиллионов (если вы не уверены, насколько они велики, список идет миллион, миллиард, триллион, затем квадриллион). Я практически не видел большого использования типа данных bigint.
Давайте создадим новую таблицу, чтобы понять тип данных bigint:
CREATE TABLE BIGINT_DEMO (PLANET_NAME VARCHAR (20), PLANET_AGE BIGINT)
|
На изображении выше мы создали новую таблицу BIGINT_DEMO с двумя столбцами: PLANET_NAME с типом данных VARCHAR и PLANET_AGE с типом данных BIGINT.
Теперь давайте попробуем вставить образец записи:
ВСТАВИТЬ В BIGINT_DEMO ВЫБРАТЬ ‘ЗЕМЛЯ’,’4543000000′
|
Мы вставили значения «EARTH» и «4543000000» в столбцы PLANET_NAME и PLANET_AGE соответственно.
Выберем запись из таблицы:
ВЫБРАТЬ * ИЗ BIGINT_DEMO
|
Таким образом, данные bigint способны хранить очень большие числа. Тип данных Bigint использует 8 байт памяти:
DECLARE @i BIGINT SET @i=100 PRINT DATALENGTH(@i)
|
В приведенном выше примере мы объявили переменную i с целочисленным типом данных, присвоили переменной значение 100, а затем распечатали длину переменной с помощью функции длины данных. Мы получили значение 8 из сообщений печати, поэтому данные bigint используют 8 байт памяти для хранения. Это одно из основных различий между типами данных int и bigint. 963-1 (9 223 372 036 854 775 807).
Преобразование целых чисел
Давайте обсудим еще одно различие между типами данных int и bigint. При преобразовании всего числа, если число больше 2 147 483 647, SQL Server преобразует его в десятичный тип данных, а не в тип данных bigint:
SELECT 2147483647 / 3 Значение AS1, 2147483649 / 3 Значение AS2;
|
В приведенном выше примере у нас есть два числа 2147483647 и 2147483649, и мы делим оба числа на 3. Но в результате второе число преобразуется в десятичный тип данных.
Целое округление десятичных знаков
Теперь мы обсудим другие темы для типов данных int и bigint. Если у нас есть таблица с целочисленным столбцом и мы пытаемся вставить десятичное значение, то число будет округлено до целого числа. Чтобы понять это поведение, давайте создадим пример таблицы:
CREATE TABLE INT_CHECK (ID INT,AMOUNT INT)
|
В приведенном выше запросе мы создаем пример таблицы INT_CHECK, которая имеет два идентификатора столбца с типом данных INT и Amount с типом данных INT.
Теперь вставьте образцы значений 121 и 1234,4243 в столбцы ID и Сумма соответственно.
INSERT INTO INT_CHECK (ID, AMOUNT) SELECT 121,1234.4243
|
Выбираем стол. Обратите внимание на значения в столбце AMOUNT, округленные до целых чисел.
SELECT * FROM INT_CHECK
|
Итак, если у вас в таблице есть целочисленный тип данных столбца и вы пытаетесь вставить десятичное значение, то значение будет усечено до целого числа, вы должны позаботиться о входящих данных приложения, чтобы они совпадали со вставленными значениями в таблице.
Преобразование столбца INT в BIGINT
При работе с таблицей базы данных вам может понадобиться изменить типы данных столбцов. В этом разделе мы обсудим преобразование типа данных столбца int в тип данных bigint, чтобы лучше понять тип данных int и bigint. Мы можем преобразовать существующий столбец int в столбец bigint с помощью команды alter.
Давайте создадим демонстрационную таблицу, чтобы объяснить эту опцию:
CREATE TABLE EMPLOYEE_DEMO (EMP_ID INT NOT NULL, SALARY INT NOT NULL)
|
Мы можем использовать команду ALTER TABLE, чтобы изменить столбец INT на столбец BIGINT:
ALTER TABLE EMPLOYEE_DEMO ALTER COLUMN EMP_ID BIGINT
|
Давайте запустим команду «sp_help», чтобы проверить изменения столбца:
sp_help ‘EMPLOYEE_DEMO’
|
Таким образом, столбец EMP_ID изменился на тип данных bigint, как и ожидалось.
Теперь давайте бросим таблицу:
УДАЛИТЬ ТАБЛИЦУ EMPLOYEE_DEMO
|
Снова создайте таблицу:
CREATE TABLE EMPLOYEE_DEMO (EMP_ID INT NOT NULL, SALARY INT NOT NULL)
|
Теперь сделаем столбец EMP_ID первичным ключом:
ALTER TABLE EMPLOYEE_DEMO ДОБАВИТЬ ОГРАНИЧЕНИЕ EMP_ID_PK PRIMARY KEY (EMP_ID)
|
Попробуем изменить тип данных столбца EMP_ID на BIG INT.
ALTER TABLE EMPLOYEE_DEMO ALTER COLUMN EMP_ID BIGINT
|
Но получаем ошибку. Итак, если столбец является первичным ключом, мы не можем изменить тип данных столбца.
Есть решение вышеуказанной проблемы. Давайте обсудим это ниже как часть типа данных int и bigint.
Создайте новый столбец bigint в той же таблице:
ALTER TABLE EMPLOYEE_DEMO ADD EMP_ID_2 BIGINT NOT NULL
|
Обновите значения из существующего столбца int в новый столбец bigint:
ОБНОВЛЕНИЕ EMPLOYEE_DEMO SET EMP_ID_2=EMP_ID
|
Теперь удалите ограничение первичного ключа из таблицы:
ALTER TABLE EMPLOYEE_DEMO DROP CONSTRAINT EMP_ID_PK
|
Удалить существующий столбец int:
ALTER TABLE EMPLOYEE_DEMO DROP COLUMN EMP_ID
|
Создайте ограничение для столбца bigint:
1 2 3 4 5 6 |
СОЗДАТЬ ТАБЛИЦУ EMPLOYEE_DEMO ДОБАВИТЬ ОГРАНИЧЕНИЕ [PK_EMPLOYEE_DEMO_EMP_ID] ПЕРВИЧНЫЙ КЛЮЧ КЛАСТЕРИРОВАННЫЙ ( EMP_ID_2 ASC 9000 3 )
|
Наконец, переименуйте столбец bigint:
EXEC sp_rename ‘EMPLOYEE_DEMO. EMP_ID_2′,’EMP_ID’,’COLUMN’
|
Но приведенное выше решение может создать проблему. Если вы используете порядок столбцов в своем приложении, это может вызвать ошибку. Вы также можете просмотреть предупреждающее сообщение выше. Есть еще одно решение этой проблемы. Давайте обсудим это, чтобы лучше понять тип данных int и bigint:
Создайте новую таблицу со структурой, аналогичной старой таблице, с новым типом данных bigint в столбце id:
CREATE TABLE EMPLOYEE_DEMO_2 (EMP_ID BIGINT NOT NULL, SALARY INT NOT NULL)
|
Скопируйте данные из старой таблицы в новую таблицу.
ВСТАВИТЬ В EMPLOYEE_DEMO_2 (EMP_ID, SALARY) ВЫБЕРИТЕ EMP_ID, SALARY FROM EMPLOYEE_DEMO
|
Удалить старую таблицу:
УДАЛИТЬ ТАБЛИЦУ EMPLOYEE_DEMO
|
Переименуйте новую таблицу:
EXEC sp_rename ‘EMPLOYEE_DEMO_2’, ‘EMPLOYEE_DEMO’
|
Заключение
В этой статье мы обсудили типы данных INT и BIGINT, их использование и сравнили оба типа данных. Вам необходимо выбрать подходящий тип данных в зависимости от требований вашего приложения.
- Автор
- Последние сообщения
Ариндам Мондал
Ариндам — опытный и целеустремленный ИТ-энтузиаст, который любит использовать свой технический опыт для решения важнейших бизнес-задач. Самоуправляемый ученик, который любит учиться каждый день. Он любит предаваться культурному разнообразию и путешествовать по новым направлениям. Ариндам имеет богатый опыт внедрения решений Azure и поддержки для крупных корпоративных клиентов, работая над несколькими проектами по разработке и усовершенствованию. ему
в настоящее время базируется в Индии и работает техническим руководителем в ведущей компании MNC.
Несколько важных фактов о его карьере:
* Имеет более 10,7 лет опыта работы в сфере ИТ на платформах Microsoft.
* Имеет около 8 лет опыта разработки баз данных SQL (T-SQL/настройка производительности/CDC) и ETL-SSIS.
* Обладает 5-летним опытом работы с Azure Environment (Azure Data Factory, Azure Data Lake Storage, Azure SQL Database, Azure Cosmos DB, Azure Synapse Analytics)
Последние сообщения Ариндама Мондала (см. все)
Разница между типами данных INT и BIGINT в Sql Server
Различия, Sql ServerBIGINT, BIGINT и INT, INT, INT и BIGINT, Sql, Sql INT и BIGINT, Sql Server, Sql Server Разница между INT и BIGINT, Sql Server INT и BIGINTBasavaraj Biradar
И INT, и BIGINT являются точными числовыми типами данных, используемыми для хранения целочисленных значений. В таблице ниже перечислены основные различия между типами данных INT и BIGINT. 963-1)
ОБЪЯВИТЬ @i INT НАБОР @i = 150 ПЕЧАТЬ @i
РЕЗУЛЬТАТ:
150
ЗАЯВИТЬ @i БОЛЬШОЙ НАБОР @i = 150 ПЕЧАТЬ @i
РЕЗУЛЬТАТ:
150
ОБЪЯВИТЬ @i INT НАБОР @i = 150 ПЕЧАТЬ ДЛИНА ДАННЫХ( @i)
РЕЗУЛЬТАТ:
4
ЗАЯВИТЬ @i БОЛЬШОЙ НАБОР @i = 150 ПЕЧАТЬ ДЛИНА ДАННЫХ( @i)
РЕЗУЛЬТАТ:
8
ОБЪЯВИТЬ @i INT НАБОР @i = 2147483648 ПЕЧАТЬ @i
РЕЗУЛЬТАТ:
Сообщение 8115, уровень 16, состояние 2, строка 2
Ошибка арифметического переполнения при преобразовании выражения в тип данных int.
ЗАЯВИТЬ @i БОЛЬШОЙ НАБОР @i = 2147483648 ПЕЧАТЬ @i
РЕЗУЛЬТАТ:
2147483648
ОБЪЯВИТЬ @i INT НАБОР @i = -150 ПЕЧАТЬ @i
РЕЗУЛЬТАТ:
-150
ЗАЯВИТЬ @i БОЛЬШОЙ НАБОР @i = -150 ПЕЧАТЬ @i
РЕЗУЛЬТАТ:
-150
[ТАКЖЕ ЧИТАЙТЕ] SMALLINT Vs INT
Выбор правильного типа данных при создании таблицы очень важен. Неправильный выбор типа данных приведет к проблемам с производительностью и хранением с течением времени по мере роста данных. Поскольку неправильный выбор типа данных требует больше места для хранения и нет. записей, хранящихся на каждой странице данных, будет меньше. Кроме того, если индекс создается для таких столбцов, он не только занимает дополнительное место при хранении значения в строке на странице данных, но также требует дополнительного места в индексе.