Базовый курс SQL. Типы данных в SQL

Forums:

[к оглавлению]

В 1 уроке мы кратко рассмотрели, что же такое типы данных в SQL. Давайте теперь остановимся на каждом из них подробнее.
Для чего нужны типы данных:

  • Ограничение формата записываемых значений. Например, столбцы числового типа могут содержать только числа
  • Эффективное использование дискового пространства. Например, данные о дате/времени можно хранить более компактно, чем если бы они были записаны в виде строки
  • Разные способы сортировки. Например, строки сортируются посимвольно. Это значит, что строка '10' будет следовать после строки '1', а не после '9'. Чтобы получить привычный порядок, следует определить тип столбца как числовой.

Уделяйте пристальное внимание определению типов данных при создании таблиц. Изменить их, когда строки уже будут заполнены, будет непросто (данные могут некорректно сконвертироваться или просто затереться). А также, если типы будут выбраны неверно, можно существенно потерять в скорости работы БД.

Различия типов данных в разных СУБД

Следует помнить, что типы данных в разных СУБД могут различаться. Даже если название типа совпадает, не лишним будет уточнить в документации его точное описание. Это позволит избежать ошибок в дальнейшей работе.

Ниже рассмотрим некоторые основные типы данных.

Строковые типы данных

Это самые распространённые типы данных. Сюда относятся все названия, имена, адреса, номера телефонов и любые другие данные, выраженные словами. Строки, какого бы типа ни были, всегда указываются в одинарных кавычках. Условно все строковые типы можно разделить на две группы: фиксированной и переменной длины.

Строки с фиксированной длиной называются так, потому что их конкретная длина определяется на этапе определении таблицы, вместе с типом. К примеру, на поле, хранящее номер телефона целесообразно выделить 11 символов. Все остальные знаки, свыше указанного значения, при этом сохранены не будут. В то же время, если поле не будет заполнено до конца, СУБД сама дополнит строку пробелами. Таким образом, все значения будут иметь одинаковую длину.

Строки переменной длины не ограничиваются "сверху" (кроме максимального размера поля данной СУБД). Некоторые типы могут иметь "нижнюю границу" (т.е. минимальное количество символов). Но в любом случае, допустимо наличие значений разной длины, и не будет никаких дополнительных пробелов.

Смысл определять фиксированную длину состоит в основном в повышении производительности: сортировка, изменение, получение данных происходит значительно быстрее, если СУБД "знает" точное количество символов в строке. А также скорость обработки увеличивает индексирование столбцов (урок 23), которое в некоторых СУБД допустимо только при фиксированной длине строк.

Итак, строковые типы данных:

  • CHAR -- строка фиксированной длины. Конкретное значение определяется при создании таблицы (может быть равно от 1 до 225 символов)
  • NCHAR -- разновидность CHAR, поддерживающая многобайтовые символы или символы Unicode (уточняйте в документации)
  • TEXT (или LONG, MEMO, VARCHAR) -- строка переменной длинны
  • NVARCHAR -- разновидность TEXT, поддерживающая многобайтовые символы или символы Unicode (уточняйте в документации)

Когда следует сохранять числа в строковом типе?

Казалось бы, номера телефонов, домов, документов и т.п. являются числами, и должны храниться в числовых форматах. Но почему не следует этого делать? Во-первых, номер документа может начинаться с нуля: 0025734. Числовой тип данных при сохранении удалит все "лишние" нули в начале значения, и мы получим 25734 и некорректные данные. Во-вторых, строковый формат - это наиболее экономичный для БД способ хранить данные. Числовой формат следует выбирать только если вам потребуется складывать, вычитать поля или вычислять максимальное и среднее значения столбца.

Числовые типы данных

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

Разница между типами в основном связана с размером диапазона значений. Чем больше допустимый диапазон, тем больше места требуется для хранения числа. Также бывают типы, которые могут хранить только целые числа, а есть - принимающие дроби.

Конкретные названия уточняйте в документации к вашей СУБД, но общее описание представлено ниже:

  • BIT -- 0 или 1. Одноразрядное значение, используется для битовых флагов
  • DECIMAL (или NUMERIC) -- Число с фиксированной или плавающей точкой
  • FLOAT (или NUMBER) -- Число с плавающей точкой
  • INT (или INTEGER) -- 4-байтовые целые числа (диапазон значений от -2147483648 до 2147483647)
  • REAL -- 4-байтовые числа с плавающей точкой
  • SMALLINT -- 2-байтовые целые числа (диапазон от -32768 до 32767)
  • TINYINT -- 1-байтовые целые числа (диапазон от 0 до 255)

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

Во многих СУБД существует отдельный тип данных: денежный. Обычно он относится к DECIMAL типу, но имеет более удобный для денежных значений диапазон. Называется CURRENCY или MONEY.

Типы данных дата/время

Те или иные типы даты и времени есть во всех СУБД. Аналогично числовым форматам, они различаются по степени точности и допустимому диапазону:

  • DATE -- Дата
  • DATETIME (или TIMESTAMP) -- Дата и время
  • SMALLDATETIME -- Дата и время с точностью до минуты (без секунд и миллисекунд)
  • TIME -- Время

Совместимость СУБД

Формат, в котором СУБД ожидает принять дату и время, может существенно различаться. Обратитесь к документации, чтобы избежать ошибок. Наиболее используемыми считаются форматы вида: 2021-04-16 или Apr 16th, 2021, но всё же и они не универсальны.

Работа с ODBC

Для работы с ODBC введён единый формат представления даты и времени: {d '2021-04-16'} - для даты, {t '16:08:35'} - для времени, {ts '2021-04-16 16:08:35'} - для полных данных.

Бинарные типы данных

Это особые типы данных, которые могут содержать в себе любые данные в бинарном виде: двоичный код, текст, графику, мультимедиа. Бинарные типы наименее совместимы в разных СУБД и реже всего используются. Однако полезно будет всё же ознакомиться с их возможностями:

  • BINARY -- Данные в двоичном виде (диапазон от 255 до 8000 байт)
  • LONG RAW -- Данные в двоичном виде переменной длинны (диапазон до 2Гбайт)
  • RAW (или иногда BINARY) -- Данные в двоичном виде фиксированной длинны (диапазон до 255 байт)
  • VARBINARY -- Данные в двоичном виде переменной длинны (диапазон до 255 байт, или до 8000 байт, в разных реализациях)

Мы представили описание основных типов данных, используемых в SQL. Работая в реальных проектах, помните, что названия и точные характеристики типов могут различаться, и всегда старайтесь подбирать тип данных наиболее подходящий вашим требованиям.

Следующая страница. Зарезервированные слова SQL.
Оглавление.