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 байт. Эквивалентен типу

    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).

Примеры числовых столбцов:


Salary MONEY,
TotalWeight DECIMAL(9,2),
Age INT,
Surplus FLOAT
Типы данных, представляющие дату и время
  • 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-dd2017-07-12

  • dd/mm/yyyy

    12/07/2017

  • mm-dd-yy07-12-17

    В таком формате двузначные числа от 00 до 49 воспринимаются как даты в диапазоне 2000-2049. А числа от 50 до 99 как диапазон чисел 1950 — 1999.

  • Month dd, yyyyJuly 12, 2017

Распространенные форматы времени:

  • hh:mi13:21

  • hh:mi am/pm1:21 pm

  • hh:mi:ss1:21:34

  • hh:mi:ss:mmm1:21:34:12

  • hh:mi:ss:nnnnnnn1: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 символов.

    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: хранит координаты местонахождения на плоскости.

НазадСодержаниеВперед

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

Пример значения INT вне допустимого диапазона
ОБЪЯВИТЬ @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

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