The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

Каталог документации / Раздел "Базы данных, SQL" / Оглавление документа

5 Типы столбцов

MySQL поддерживает ряд типов столбцов, которые могут быть сгруппированы в три категории: числовые, типы даты и времени и строковые (символьные). Этот раздел сначала дает краткий обзор доступных типов и суммирует требования к памяти для хранения каждого типа столбцов, затем обеспечивает более детальное описание свойств типов в каждой категории. Краткий обзор преднамеренно краток. Ниже следуют более подробные описания, с которыми нужно консультироваться для получения дополнительной информации относительно специфических типов столбцов, типа допустимых форматов значений, которые Вы можете определять.

Типы столбцов, поддерживаемые MySQL, перечислены ниже. Следующие символы кода используются в описаниях:

M
Указывает максимальный размер отображения. Максимальный допустимый размер отображения равен 255.
D
Применяется к типам с плавающей запятой и указывает число цифр после десятичной отметки. Максимальное возможное значение равно 30, но должно быть не больше, чем M-2.

Квадратные скобки ([ и ]) указывают части спецификаторов типа, которые являются факультативными.

Обратите внимание, что, если Вы определяете для столбца ZEROFILL, MySQL автоматически добавит к столбцу атрибут UNSIGNED.

TINYINT[(M)] [UNSIGNED] [ZEROFILL]
Очень маленькое целое число. Диапазон значений со знаком от -128 до 127. Диапазон значений без знака от 0 до 255.
SMALLINT[(M)] [UNSIGNED] [ZEROFILL]
Маленькое целое число. Диапазон со знаком от -32768 до 32767. Диапазон без знака от 0 до 65535.
MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL]
Целое число средних размеров. Диапазон со знаком от -8388608 до 8388607. Диапазон значений без знака от 0 до 16777215.
INT[(M)] [UNSIGNED] [ZEROFILL]
Целое число нормального размера. Диапазон значений со знаком от -2147483648 до 2147483647. Диапазон значений без знака от 0 до 4294967295.
INTEGER[(M)] [UNSIGNED] [ZEROFILL]
Синоним для INT.
BIGINT[(M)] [UNSIGNED] [ZEROFILL]
Большое целое число. Диапазон значений со знаком от -9223372036854775808 до 9223372036854775807. Диапазон значений без знака от 0 до 18446744073709551615.

Некоторые вещи, которые Вы должны знать относительно столбцов типа BIGINT:

FLOAT(precision) [ZEROFILL]
Число с плавающей запятой. Не может быть без знака. Точность (precision) может быть в пределах <=24, для числа с одиночной точностью, или между 25 и 53, для числа двойной точности. Эти типы подобны FLOAT и DOUBLE, описанным ниже. FLOAT(X) имеет тот же самый диапазон, что и соответствующие типы FLOAT и DOUBLE, но размер отображения и число десятичных чисел неопределенны. В MySQL Version 3.23 это и есть истинное значение с плавающей запятой. В старых версиях MySQL FLOAT(precision) всегда имеет 2 десятичных числа. Обратите внимание, что использование типа FLOAT может создавать Вам некоторые непредвиденные проблемы, поскольку все вычисления в MySQL всегда выполнены с двойной точностью. Этот синтаксис предусмотрен для ODBC-совместимости.
FLOAT[(M,D)] [ZEROFILL]
Маленькое (с одиночной точностью) число с плавающей запятой. Не может быть без знака. Допустимые значения от -3.402823466E+38 до -1.175494351E-38, 0 и от 1.175494351E-38 до 3.402823466E+38. M задает размер отображения, а D число десятичных чисел. Соответствует FLOAT(X), где X <= 24.
DOUBLE[(M,D)] [ZEROFILL]
Число нормального размера (двойная точность) с плавающей запятой. Не может быть без знака. Допустимые значения от -1.7976931348623157E+308 до -2.2250738585072014E-308, 0 и от 2.2250738585072014E-308 до 1.7976931348623157E+308. M задает размер отображения, а D число десятичных чисел. Соответствует DOUBLE без параметра или FLOAT(X), где 25 <= X <= 53.
DOUBLE PRECISION[(M,D)] [ZEROFILL]
REAL[(M,D)] [ZEROFILL]
Синонимы для DOUBLE.
DECIMAL[(M[,D])] [ZEROFILL]
Распакованное число с плавающей запятой. Не может быть без знака. Ведет себя подобно столбцу CHAR: "распакованный" означает, что число сохранено как строка, используя один символ для каждой цифры значения. Десятичная отметка и, для отрицательных чисел, знак - не рассчитана в M (но пробел для них зарезервирован). Если D=0, значения не будут иметь никакой десятичной отметки или дробной части. Максимальный диапазон значений DECIMAL аналогичен DOUBLE, но фактический диапазон для данного столбца DECIMAL может быть задан через M и D. Если D не задано, оно будет установлено в 0. Если же не задано M, оно считается равным 10. Обратите внимание, что в MySQL Version 3.22 аргумент M должен включать пробел, необходимый для знака и десятичной отметки.
NUMERIC(M,D) [ZEROFILL]
Синоним для DECIMAL.
DATE
Дата. Поддерживаемый диапазон: от 1000-01-01 до 9999-12-31. MySQL отображает значения DATE в формате YYYY-MM-DD, но позволяет Вам назначать значения столбцам DATE используя строки или числа.
DATETIME
Комбинация даты и времени. Поддерживаемый диапазон: от 1000-01-01 00:00:00 до 9999-12-31 23:59:59. MySQL отображает значения типа DATETIME в формате YYYY-MM-DD HH:MM:SS, но позволяет Вам назначать значения столбцам DATETIME, используя строки или числа.
TIMESTAMP[(M)]
Метка времени. Поддерживаемый диапазон: от 1970-01-01 00:00:00 примерно до 2037. MySQL отображает значения типа TIMESTAMP в форматах YYYYMMDDHHMMSS, YYMMDDHHMMSS, YYYYMMDD или YYMMDD, в зависмости от значения M: 14 (или пропущено), 12, 8 или 6, но позволяет Вам задавать значения столбцам TIMESTAMP, используя строки или числа. Столбец TIMESTAMP полезен для записи даты и времени операции INSERT или UPDATE потому, что он будет автоматически установлен к дате и времени самой последней операции, если Вы не задаете значение самостоятельно. Вы можете также устанавливать его к текущей дате и времени, назначая значение NULL. TIMESTAMP всегда сохраняется в 4 байтах. Параметр M воздействует только на то, как отображается столбец TIMESTAMP. Обратите внимание, что столбцы TIMESTAMP(X) при X, равном 8 или 14, являются числами, в то время как другие столбцы TIMESTAMP(X) представляют собой строки! Это только должно гарантировать, что можно надежно сбросить таблицу в дамп, а потом восстанавливать ее с этими типами!
TIME
Время. Поддерживаемый диапазон: от -838:59:59 до 838:59:59. MySQL отображает значения типа TIME в формате HH:MM:SS, но позволяет Вам задавать значения столбцам TIME, используя строки или числа.
YEAR[(2|4)]
Год с двумя или четыремя цифрами (по умолчанию задано 4). Допустимые значения: от 1901 до 2155, 0000 в формате года с 4 цифрами, и 1970-2069, если Вы используете формат с 2 цифрами (70-69). MySQL отображают значения YEAR в формате YYYY, но позволяет Вам указывать значения столбцам типа YEAR, используя строки или числа. Впервые тип YEAR появился в MySQL Version 3.22.
[NATIONAL] CHAR(M) [BINARY]
Строка фиксированной длины, которая всегда дополняется справа пробелами до определенной длины. Диапазон M от 1 до 255 символов. Конечные пробелы будут удалены, когда значение извлекается из таблицы. Переменные CHAR сортируются и сравниваются без учета регистра согласно заданному по умолчанию набору символов, если не задано ключевое слово BINARY. NATIONAL CHAR (короткая форма NCHAR) представляет собой взятый из ANSI SQL способ определить, что столбец CHAR должен использовать заданный набор символов CHARACTER. Это значение по умолчанию в MySQL. CHAR является сокращением для CHARACTER. MySQL позволяет Вам создавать столбец типа CHAR(0). Это главным образом полезно, когда Вы должны обеспечить совместимость с некоторыми старыми прикладными программами, которые зависят от существования столбца, но фактически не использует значение. Это также очень удобно, когда Вы нуждаетесь в столбце, который может брать только 2 значения: CHAR(0), который не определен как NOT NULL, займет всего лишь один бит и может принимать только 2 значения: NULL или "".
[NATIONAL] VARCHAR(M) [BINARY]
Строка переменной длины. A variable-length string. ОБРАТИТЕ ВНИМАНИЕ: Конечные пробелы будут автоматически удалены, когда значение сохранено (это отличается от спецификаций ANSI SQL). Диапазон M от 1 до 255 символов. Значения типа VARCHAR сортируются и сравниваются без учета регистра согласно заданному по умолчанию набору символов, если не задано ключевое слово BINARY. VARCHAR является сокращением для CHARACTER VARYING.
TINYBLOB
TINYTEXT
Столбцы BLOB или TEXT имеют максимальную длину в 255 (2^8-1) символов.
BLOB
TEXT
Столбцы BLOB или TEXT имеют максимальную длину в 65535 (2^16-1) символов.
MEDIUMBLOB
MEDIUMTEXT
Столбцы MEDIUMBLOB или MEDIUMTEXT имеют максимальную длину в 16777215 (2^24-1) символов.
LONGBLOB
LONGTEXT
Столбцы LONGBLOB или LONGTEXT имеют максимальную длину в 4294967295 (2^32-1) символов. Обратите внимание, что поскольку протокол клиент-сервер и таблицы MyISAM имеет в настоящее время ограничение в 16M на пакет связи/строку таблицы, Вы не можете использовать весь диапазон этого типа.
ENUM('value1','value2',...)
Перечисление. Строковый объект, который может иметь только одно значение, выбранное из списка значений value1, value2, ..., NULL или специальное значение ошибки "". ENUM может иметь максимум 65535 разных значений.
SET('value1','value2',...)
Множество. Строковый объект, который может иметь ноль или больше значений, каждое из которых должно быть выбрано из списка значений value1, value2, .... SET может иметь максимум 64 члена.

5.1 Числовые типы

MySQL поддерживает все числовые типы ANSI/ISO SQL92. Эти типы включают точные числовые типы данных (NUMERIC, DECIMAL, INTEGER и SMALLINT), а также приблизительные числовые типы данных (FLOAT, REAL и DOUBLE PRECISION). Ключевое слово INT представляет собой синоним для INTEGER, а ключевое слово DEC является синонимом для DECIMAL.

Типы NUMERIC и DECIMAL выполнены как тот же самый тип MySQL, как разрешено стандартом SQL92. Они используются для значений, для которых важно сохранить идеальную точность, например, с валютными данными. При объявлении столбца одного из этих типов точность и масштаб могут быть (и обычно бывают) определены, например:

   salary DECIMAL(9,2)

В этом примере 9 (точность, precision) представляет число значащих десятичных цифр, которые будут сохранены для значений, а 2 (масштаб, scale) представляет число цифр, которые будут сохранены после десятичной отметки. В этом случае, следовательно, диапазон значений, которые могут быть сохранены в столбце salary от -9999999.99 до 9999999.99. (MySQL может фактически сохранять числа до 9999999.99 в этом столбце потому, что не требуется сохранять знак для положительных чисел).

В ANSI/ISO SQL92 синтаксис DECIMAL(p) эквивалентен DECIMAL(p,0). Точно так же синтаксис DECIMAL является эквивалентным DECIMAL(p,0), где реализации позволяют менять значение p. MySQL в настоящее время не поддерживает никакую из этих различных форм типов данных DECIMAL/NUMERIC. Это не серьезная проблема, поскольку принципиальные выгоды этих типов происходят от способности управлять точностью и масштабом явно.

Значения типов DECIMAL и NUMERIC сохранены как строки, в не как двоичные числа с плавающей запятой, чтобы сохранить десятичную точность значений. Один символ используется для каждой цифры значения, десятичной отметки (если scale > 0) и знака - (для отрицательных чисел). Если scale равен 0, значения DECIMAL и NUMERIC не содержат никакой десятичной отметки или дробной части.

Максимальный диапазон значений DECIMAL и NUMERIC аналогичен диапазону для DOUBLE, но фактический диапазон для данного столбца DECIMAL или NUMERIC может быть ограничен точностью или масштабом для данного столбца. Когда такой столбец назначен, значение с большим количеством цифр после десятичной отметки, чем позволяется определенным масштабом, будет округлено до заданного масштаба. Когда происходит переполнение (столбцу присваивается значение, превышающее его диапазон), MySQL сохраняет значение, представляющее соответствующий максимум этого диапазона.

MySQL поддерживает как расширение стандарта ANSI/ISO SQL92 встроенные типы TINYINT, MEDIUMINT и BIGINT как перечислено в таблицах выше. Другое расширение поддержано MySQL для факультативного определения ширины отображения значения в круглых скобках после основного ключевого слова для типа (например, INT(4)). Эта факультативная спецификация ширины используется для вывода значений, чья ширина меньше, чем ширина, определенная для столбца, но не сдерживает диапазон значений, которые могут быть сохранены в столбце, или число цифр, которые будут отображаться для значений, чья ширина превышает заданную. Когда используется вместе с факультативным атрибутом расширения ZEROFILL, дополнение значения по умолчанию пробелами заменено на нули. Например, для столбца, объявленного как INT(5) ZEROFILL, значение 4 превратится в 00004. Обратите внимание, что, если Вы сохраняете значения большие, чем ширина отображения в целочисленном столбце, Вы можете испытывать проблемы, когда MySQL генерирует временные таблицы для некоторых сложных объединений, поскольку в этих случаях MySQL полагает, что данные вписывались в первоначальную ширину столбца.

Все встроенные типы могут иметь факультативный (ненормативный) атрибут UNSIGNED. Значения без знака могут использоваться, когда Вы хотите позволять только положительные числа в столбце, и Вы нуждаетесь в немного большем числовом диапазоне столбца.

Тип FLOAT используется, чтобы представить приблизительные числовые типы данных. Стандарт ANSI/ISO SQL92 позволяет факультативную спецификацию точности (но не диапазон образца) в битах после ключевого слова FLOAT в круглых скобках. MySQL-реализация также поддерживает эту факультативную спецификацию точности. Когда ключевое слово FLOAT используется для типа столбца без спецификации точности, MySQL применяет четыре байта, чтобы сохранить значения. Различный синтаксис также поддержан, с двумя числами, заданными в круглых скобках после ключевого слова FLOAT. С этой опцией первое число продолжает представлять требования к памяти для значения в байтах, а второе определяет число цифр, которые будут сохранены и отображаться после десятичной отметки (как с DECIMAL и NUMERIC). Когда MySQL нужно сохранить число для такого столбца с большим количеством цифр после десятичной отметки, чем определено для столбца, значение будет автоматически округлено, чтобы устранить лишние цифры.

Типы REAL и DOUBLE PRECISION не принимают спецификации точности. В качестве дополнения к стандарту ANSI/ISO SQL92 MySQL распознает DOUBLE как синоним для DOUBLE PRECISION. В отличие от требования стандарта, чтобы точность для REAL была меньшие, чем используемая для DOUBLE PRECISION, MySQL реализует то и другое как 8-байтные double-precision floating-point значения (при работе не в ANSI mode). Для максимальной мобильности код, требующий хранение приблизительных числовых значений данных должен использовать FLOAT или DOUBLE PRECISION без спецификации точности или количества чисел после десятичной точки.

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

Например, диапазон столбца INT от -2147483648 до 2147483647. Если Вы пробуете вставлять -9999999999 в столбец типа INT, значение будет усечено к нижей границе диапазона и сохранено -2147483648. Точно так же, если Вы пробуете вставлять 9999999999, вместо этого будет сохранено 2147483647.

Если столбец INT определен как UNSIGNED, размер диапазона столбца тот же самый, но произойдет сдвиг значений на 0 и 4294967295. Если Вы пробуете сохранять -9999999999 и 9999999999, значения, сохраненные в столбце, станут соответственно 0 и 4294967296.

Преобразования, которые происходят из-за усечения, сообщаются как ``warnings'' для инструкций ALTER TABLE, LOAD DATA INFILE, UPDATE и многострочного варианта INSERT.

5.2 Типы Date и Time

Типы даты и времени: DATETIME, DATE, TIMESTAMP, TIME и YEAR. Каждый из них имеет диапазон допустимых значений, также как и некий ноль, который используется, когда Вы определяете, действительно, запрещенное значение. Обратите внимание, что MySQL позволяет Вам сохранять некоторые недопустимые значения даты, например, 1999-11-31. Причина этого в том, что обрабатывать проверку даты ответственность прикладной программы, а не сервера SQL. Чтобы сделать проверку даты быстрой, MySQL проверяет только то, что месяц находится в диапазоне 0-12, и день находится в диапазоне 0-31. Вышеупомянутые диапазоны определены так потому, что MySQL позволяет Вам сохранять в столбцах DATE или DATETIME даты, где день или месяц нулевой. Это чрезвычайно полезно для прикладных программ, которые должны сохранить дату рождения, для которой Вы не знаете точную дату. В этом случае Вы просто сохраняете дату подобно 1999-00-00 или 1999-01-00. Вы, конечно, не можете получать правильное значение из функций, подобных DATE_SUB() или DATE_ADD, для таких неправильных дат.

Имеются некоторые общие вещи, которые стоит иметь в виду при работе с типами даты и времени:

5.2.1 Проблема Y2K и типы Date

MySQL непосредственно Y2K-безопасен, но вводимые значения таковыми не явдяются. Любой ввод, содержащий значения года с 2 цифрами, неоднозначен потому, что столетие неизвестно. Такие значения должны интерпретироваться в форму с 4 цифрами потому, что MySQL сохраняет годы, внутренне всегда используя четыре цифры.

Для типов DATETIME, DATE, TIMESTAMP и YEAR MySQL интерпретирует даты с неоднозначным годом так:

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

ORDER BY сортирует значения типов YEAR/DATE/DATETIME с 2 цифрами правильно.

Обратите внимание также, что некоторые функции, подобно MIN() и MAX(), преобразуют TIMESTAMP/DATE в число. Это означает, что timestamp с годом с 2 цифрами не будет работать правильно с этими функциями. Исправление в этом случае должно преобразовать TIMESTAMP/DATE к формату года с 4 цифрами или использовать нечто вроде MIN(DATE_ADD(timestamp,INTERVAL 0 DAYS)).

5.2.2 Типы DATETIME, DATE и TIMESTAMP

Типы DATETIME, DATE и TIMESTAMP связаны. Этот раздел описывает их характеристики и чем они отличаются.

Тип DATETIME используется, когда Вы нуждаетесь в значениях, которые содержат информацию о дате и времени. MySQL получает и отображает значения DATETIME в формате YYYY-MM-DD HH:MM:SS. Поддерживаемый диапазон от 1000-01-01 00:00:00 до 9999-12-31 23:59:59.

Тип DATE используется, когда Вы нуждаетесь только в значении даты, без части времени. MySQL получает и отображает значения DATE в формате YYYY-MM-DD. Поддерживаемый диапазон от 1000-01-01 до 9999-12-31.

Тип столбца TIMESTAMP обеспечивает тип, который Вы можете использовать, чтобы автоматически отметить операции INSERT или UPDATE текущей датой и временем. Если Вы имеете много столбцов типа TIMESTAMP, только первый модифицируется автоматически.

Автоматическое модифицирование первого столбца TIMESTAMP происходит при любом из условий:

Второй и последующие столбцы типа TIMESTAMP также могут быть установлены к текущей дате и времени. Только установите столбец в NULL или в NOW().

Вы можете устанавливать любой столбец TIMESTAMP к значению иному, чем текущая дата и время, устанавливая это явно. Это истинно даже для первого столбца TIMESTAMP. Вы можете использовать это свойство, если, например, Вы хотите, чтобы TIMESTAMP был установлен к текущей дате и времени, когда Вы создаете строку, но не был изменен всякий раз, когда строка модифицируется позже:

Значения TIMESTAMP имеют точность в одну секунду. Значения отображаются как числа.

Формат, в котором MySQL получает и отображает значения TIMESTAMP, зависят от размера отображения, как иллюстрируется таблицей ниже. Полный формат TIMESTAMP имеет 14 цифр, но столбцы могут быть созданы с более короткими размерами отображения:

Тип столбцаФормат отображения
TIMESTAMP(14)YYYYMMDDHHMMSS
TIMESTAMP(12)YYMMDDHHMMSS
TIMESTAMP(10)YYMMDDHHMM
TIMESTAMP(8)YYYYMMDD
TIMESTAMP(6)YYMMDD
TIMESTAMP(4)YYMM
TIMESTAMP(2)YY

Все столбцы типа TIMESTAMP имеют тот же самый размер памяти, независимо от размера отображения. Наиболее распространенные размеры: 6, 8, 12 и 14. Вы можете определять произвольный размер при создании таблицы, но значения 0 или больше, чем 14, будут установлены в 14. Нечетные размеры в диапазоне от 1 до 13 будут приведены к следующему четному числу.

Вы можете определять значения DATETIME, DATE и TIMESTAMP, использующие любой из общего набора форматов:

Запрещенные значения DATETIME, DATE или TIMESTAMP преобразованы в нулевое значение соответствующего типа (0000-00-00 00:00:00, 0000-00-00 или 00000000000000).

Для значений, определенных как строки, которые включают разделители частей даты, не требуется определять две цифры для значений месяца или дня, которые являются меньше, чем 10. 1979-6-9 эквивалентно 1979-06-09. Точно так же для значений, определенных как строки, которые включают разделители части времени, необязательно определять две цифры для значений часа, минут или секунды, которые меньше, чем 10. 1979-10-30 1:2:3 то же самое, что и 1979-10-30 01:02:03.

Значения, определенные как числа, должны быть длиной в 6, 8, 12 или 14 цифр. Если число длиной в 8 или 14 цифр, считается, что оно в формате YYYYMMDD или YYYYMMDDHHMMSS, и что год задан первыми 4 цифрами. Если число длиной в 6 или 12 цифр, считается, что оно в формате YYMMDD или YYMMDDHHMMSS, и что год задан первыми 2 цифрами. Числа, которые не соответствуют этим длинам, дополняются нулями до самой близкой длины.

Значения, определенные как неразграниченные строки интерпретируются, используя их длину как она есть. Это означает, что Вы не должны использовать строки короче шести символов. Например, если Вы определяете 9903, думая, что представите март 1999 года, Вы найдете, что MySQL вставляет ноль для даты в Вашу таблицу. Это потому, что значения года и месяца 99 и 03, но часть дня пропущено, так что значение не является допустимой датой.

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

Вы можете до некоторой степени назначать значения одного типа даты объекту иного типа даты. Однако, может иметься некоторое изменение значения или потери информации:

Знайте некоторые ловушки при определении значений даты:

5.2.3 Тип TIME

MySQL получает и отображает значения TIME в формате HH:MM:SS (или HHH:MM:SS для больших значений часов). Значения TIME могут располагаться в диапазоне от -838:59:59 до 838:59:59. Причина того, что часть часов может быть настолько большой в том, что тип TIME может использоваться не только, чтобы представить время дня (которое должно быть меньше, чем 24 часа), но также и прошедшее время или интервал времени между двумя событиями (который может быть намного больше, чем 24 часа).

Вы можете определять значения TIME разными способами:

Для значений TIME, определенных как строки, которые включают разделитель частей времени, необязательно задавать две цифры для часов, минут или секунд, которые меньше 10. Указание 8:3:2 аналогично 08:03:02.

Будьте внимательны относительно назначения коротких значений TIME. Без точки с запятой MySQL интерпретирует значения, используя предположение, что крайние справа цифры представляют секунды. MySQL интерпретирует значения TIME как прошедшее время, а не время дня. Например, Вы могли задавать 1112 и 1112 как 11:12:00, но MySQL поймет это как 00:11:12. Точно так же 12 и 12 интерпретируются как 00:00:12. Значения TIME с точкой с запятой вместо этого, всегда обрабатываются как время дня. Так 11:12 будет означать 11:12:00, но не 00:11:12.

Значения, которые находятся вне диапазона TIME, но допустимы во всем остальном, будут усечены до соответствующей границы диапазона. Например, -850:00:00 и 850:00:00 превратятся в -838:59:59 и 838:59:59.

Недопустимые значения TIME превратятся в 00:00:00. Обратите внимание, что так как 00:00:00 представляет собой допустимое значение TIME, нет никакого способа понять по сохраненному в таблице 00:00:00, было ли первоначальное значение определено как 00:00:00 или нет.

5.2.4 Тип YEAR

Тип YEAR представляет собой тип с 1 байтом, используемый для представления лет.

MySQL получает и отображает значения типа YEAR в формате YYYY. Диапазон: от 1901 до 2155.

Вы можете определять значения YEAR в форматах:

Запрещенные значения YEAR будут преобразованы в 0000.

5.3 Строковые типы

Строковыми считаются типы: CHAR, VARCHAR, BLOB, TEXT, ENUM и SET. Этот раздел описывает как работу типов, их требования к памяти и как использовать их в Ваших запросах. Сразу следует отметить, что к строковым причислены типы, которые в разных языках программирования таковыми не являются, например, ENUM и SET.

5.3.1 Типы CHAR и VARCHAR

Типы CHAR и VARCHAR подобны, но отличаются способом их хранения и получения.

Длина столбца CHAR фиксирована и задается, когда Вы создаете таблицу. Длина может быть любым значением между 1 и 255. В MySQL Version 3.23 длина CHAR может быть от 0 до 255. Когда значения CHAR сохраняются в таблице, они дополняются справа пробелами до нужной длины. Когда значения CHAR получены, конечные пробелы будут автоматически удалены.

Значения в столбцах VARCHAR представляют собой строки переменной длины. Вы можете объявлять, что столбец VARCHAR будет любой длины между 1 и 255, точно как для столбцов типа CHAR. Однако, в отличие от CHAR, значения VARCHAR сохранены, используя ровно столько символов, сколько надо, плюс один байт, чтобы записать длину (аналог типа String в языке Pascal). Значения не дополняются, вместо этого конечные пробелы будут удалены, когда значения сохранены в таблице. Это удаление пробелов отличается от спецификации ANSI SQL, там они остаются.

Если Вы назначаете значение столбцу CHAR или VARCHAR, которое превышает максимальную длину столбца, значение будет усечено, чтобы поместиться в столбец.

Таблица ниже иллюстрирует различия между двумя типами столбцов, показывая результат сохранения различных значений в CHAR(4) и VARCHAR(4):

ЗначениеCHAR(4) Для хранения надоVARCHAR(4) Для хранения надо
''' '4 байта ''1 байт
'ab''ab '4 байта 'ab'3 байта
'abcd''abcd'4 байта 'abcd'5 байт
'abcdefgh''abcd'4 байта 'abcd'5 байт

Значения, полученные из столбцов CHAR(4) и VARCHAR(4), будут те же самые в каждом случае потому, что конечные пробелы удалены из столбцов CHAR после поиска.

Значения в столбцах CHAR и VARCHAR сортируются и сравниваются без учета регистра, если атрибут BINARY не был определен, когда таблица была создана. Атрибут BINARY означает, что значения столбца сортируются и сравниваются с учетом регистра согласно порядку символов серверной (не клиентской!) машины MySQL. BINARY не воздействует на то, как столбец будет сохранен или получен.

Атрибут BINARY липкий. Это означает, что, если столбец, отмеченный как BINARY, используется в выражении, все выражение сравнивается как значение BINARY.

MySQL может тихо изменять тип столбца CHAR или VARCHAR при создании таблицы. Подробности в разделе "7.3.1 Тихие изменения спецификации столбца".

5.3.2 Типы BLOB и TEXT

BLOB представляет собой двоичный большой объект, который может хранить переменное количество данных. Есть четыре типа BLOB'ов: TINYBLOB, BLOB, MEDIUMBLOB и LONGBLOB, отличающиеся только по максимальной длине значений, которые они могут хранить.

Четыре типа TEXT: TINYTEXT, TEXT, MEDIUMTEXT и LONGTEXT соответствуют четырем типам BLOB и имеют те же самые максимальные длины и требования к памяти. Единственное различие между типами BLOB и TEXT в том, что сортировка выполняется с учетом регистра для значений типа BLOB и без учета регистра для TEXT.

Если Вы назначаете значение столбцу BLOB или TEXT, которое превышает максимальную длину для типа столбца, значение будет усечено, чтобы поместиться.

В большинстве случаев Вы можете расценивать столбец TEXT как VARCHAR, который может быть столь большим, как Вы хотите. Точно так же Вы можете расценивать столбец BLOB как VARCHAR BINARY. Различия в том, что:

MyODBC определяет значения BLOB как LONGVARBINARY, а значения типа TEXT как LONGVARCHAR.

Поскольку значения BLOB и TEXT могут быть чрезвычайно длинными, Вы можете столкнуться с ограничениями при использовании:

Обратите внимание, что каждое значение BLOB или TEXT внутренне представляется отдельно распределенным объектом. Это отличие от всех других типов столбца, для которых память распределена один раз на столбец, когда таблица открывается.

5.3.3 Тип ENUM

ENUM представляет собой строковый объект, чье значение обычно выбрано из списка допустимых значений, которые перечислены явно в спецификации столбца при создании таблицы.

Значение может также быть пустой строкой ("") или NULL при некоторых обстоятельствах:

Каждое значение перечисления имеет индекс:

Например, столбец, определенный как ENUM("one","two","three"), может иметь любое из значений, показанных ниже. Индекс каждого значения также показывается:

ЗначениеИндекс
NULLNULL
"" 0
"one"1
"two"2
"three"3

Перечисление может иметь максимум 65535 элементов.

Регистр неважен, когда Вы назначаете значения столбцу ENUM. Однако, значения, полученные из столбца позже имеют регистр с соответствием значений, которые использовались, чтобы определить допустимые значения при создании данной таблицы.

Если Вы получаете ENUM в числовом контексте, будет возвращен индекс значения столбца. Например, Вы можете получать числовые значения из столбца ENUM подобно этому:

mysql> SELECT enum_col+0 FROM tbl_name;

Если Вы сохраняете число в ENUM, он обрабатывается как индекс, и сохраненное значение представляет собой член перечисления с этим индексом. Однако, это не будет работать с вызовом LOAD DATA, который обрабатывает весь свой ввод как строки.

Значения ENUM сортируются согласно порядку, в котором члены перечисления были указаны в спецификации столбца. Другими словами, значения ENUM сортируются согласно их индексным числам. Например, "a" окажется перед "b" для ENUM("a","b"), но "b" опередит "a" для ENUM("b", "a"). Пустые строки окажутся перед непустыми строками, а значения NULL перед всеми другими значениями перечисления.

Если Вы хотите получать все возможные значения для столбца ENUM, Вы должны использовать SHOW COLUMNS FROM table_name LIKE enum_column_name и анализировать определение ENUM во втором столбце вывода.

5.3.4 Тип SET

SET представляет собой строковый объект, который может иметь ноль или большее количество значений, каждое из которых должно быть выбрано из списка допустимых значений, которые перечислены явно в спецификации столбца при создании таблицы. Значения столбца SET, которые состоят из многих значений набора, определены членами, отделяемыми запятыми (,). Следствие этого: значения членов SET не могут самостоятельно содержать запятые.

Например, столбец, определенный как SET("one","two") NOT NULL, может иметь любое из этих значений:

""
"one"
"two"
"one,two"

SET может иметь максимум 64 различных членов.

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

mysql> SELECT set_col+0 FROM tbl_name;

Если число сохранено в столбце SET, биты, которые установлены в двоичном представлении числа, определяют члены набора в значении столбца. Предположим, что столбец определен как SET("a","b","c","d"). Члены имеют следующие разрядные значения:

SET член множества Десятичное значениеДвоичное значение
a10001
b20010
c40100
d81000

Если Вы назначаете число 9 этому столбцу (в двоичной системе это будет 1001), то первый и четвертый члены значения SET (то есть, "a" и "d") будут выбраны, и возникающим в результате значением будет "a,d".

Для значения, содержащего больше, чем один элемент SET, не имеет значения порядок элементов, в котором они перечислены, когда Вы вставляете значение. Также не важно, сколько раз данный элемент перечислен в значении. Когда значение потом будет получено из таблицы, каждый элемент в нем появится лишь однажды, причем элементы будут перечислены согласно порядку, в котором они были определены при создании таблицы. Например, если столбец определен как SET("a","b","c","d"), то "a,d", "d,a" и "d,a,a,d,d" будут появляться как "a,d" при получении данных из таблицы.

Значения SET сортируются в цифровой форме. NULL расположится перед другими значениями.

Обычно, Вы выполняете SELECT на столбце SET, применяя оператор LIKE или функцию FIND_IN_SET():

mysql> SELECT * FROM tbl_name WHERE set_col LIKE '%value%';
mysql> SELECT * FROM tbl_name WHERE FIND_IN_SET('value',set_col)>0;

Но следующее будет также работать:

mysql> SELECT * FROM tbl_name WHERE set_col = 'val1,val2';
mysql> SELECT * FROM tbl_name WHERE set_col & 1;

Первая из этих инструкций ищет точное соответствие. Вторая ищет значения, содержащие первый член набора.

Если Вы хотите получать все возможные значения для столбца SET, Вы должны использовать: SHOW COLUMNS FROM table_name LIKE set_column_name и анализировать второй столбец определения.

5.4 Выбор правильного типа для столбца

Для наиболее эффективного использования памяти, попробуйте использовать наиболее подходящий тип во всех случаях. Например, если целочисленный столбец будет использоваться для значений в диапазоне между 1 и 99999, лучшим является тип MEDIUMINT UNSIGNED.

Точное представление денежных величин обычно является проблемой. В MySQL Вы должны использовать тип DECIMAL. Это сохранено как строка, так что никакая потеря точности не должна произойти. Если точность не слишком важна, тип DOUBLE также может быть достаточен.

Для высокой точности, Вы можете всегда преобразовывать данные в фиксированный тип BIGINT. Это позволяет Вам делать все вычисления с целыми числами и преобразовывать результаты обратно в значения с плавающей запятой только тогда, когда это необходимо.

5.5 Использование типов столбцов из других СУБД

Чтобы использовать код, написанный для реализаций SQL от других авторов, MySQL отображает типы столбцов как показано в таблице ниже. Эти отображения делают проще перенос определения таблиц:

Чужой типТип в MySQL
BINARY(NUM)CHAR(NUM) BINARY
CHAR VARYING(NUM)VARCHAR(NUM)
FLOAT4FLOAT
FLOAT8DOUBLE
INT1TINYINT
INT2SMALLINT
INT3MEDIUMINT
INT4INT
INT8BIGINT
LONG VARBINARYMEDIUMBLOB
LONG VARCHARMEDIUMTEXT
MIDDLEINTMEDIUMINT
VARBINARY(NUM)VARCHAR(NUM) BINARY

Отображение типа столбца происходит при создании таблицы. Если Вы создаете таблицу с типами, используемыми другими авторами, а затем выдаете команду DESCRIBE tbl_name, MySQL сообщает структуру таблицы, использующую эквивалентные типы MySQL.

5.6 Требования столбцов к памяти

Требования к памяти для каждого из типов столбцов, поддерживаемых MySQL, перечислены ниже по категориям.

5.2.6.1 Требования к памяти для чисел

Тип столбцаДля хранения надо
TINYINT1 байт
SMALLINT2 байта
MEDIUMINT3 байта
INT4 байта
INTEGER4 байта
BIGINT8 байта
FLOAT(X)4, если X <= 24, или 8, если 25 <= X <= 53
FLOAT4 байта
DOUBLE8 байта
DOUBLE PRECISION8 байта
REAL8 байта
DECIMAL(M,D)M+2 байт, если D > 0, M+1 байт, если D=0 (D+2, если M < D )
NUMERIC(M,D)M+2 байт, если D > 0, M+1 байт, если D=0 (D+2, если M < D )

5.2.6.2 Требования к памяти для даты и времени

Тип столбцаДля хранения надо
DATE3 байта
DATETIME8 байта
TIMESTAMP4 байта
TIME3 байта
YEAR1 байт

5.2.6.3 Требования к памяти для строк

Тип столбцаДля хранения надо
CHAR(M)M байт, 1 <= M <= 255
VARCHAR(M)L+1 байт, где L <= M и 1 <= M <= 255
TINYBLOB, TINYTEXTL+1 байт, где L < 2^8
BLOB, TEXTL+2 байта, где L < 2^16
MEDIUMBLOB, MEDIUMTEXT L+3 байта, где L < 2^24
LONGBLOB, LONGTEXTL+4 байта, где L < 2^32
ENUM('value1','value2',...)1 или 2 байта, в зависимости от количества значений перечисления (максимум 65535 значений)
SET('value1','value2',...)1, 2, 3, 4 или 8 байт, в зависимости от числа членов набора (максимум 64 члена)

Типы VARCHAR, BLOB и TEXT представляют собой типы переменной длины, для которых требования к памяти зависят от фактической длины значения столбца (представлена как L в предшествующей таблице). Например, столбец VARCHAR(10) может хранить строку с максимальной длиной в 10 символов. Фактическая требуемая память равна длине строки (L) плюс 1 байт, чтобы записать длину строки. Для строки abcd, L равно 4, а требования к памяти равны 5 байтам.

Типы BLOB и TEXT требуют 1, 2, 3 или 4 байта, чтобы записать длину значения столбца, в зависимости от максимальной возможной длины типа.

Если таблица включает любые столбцы переменной длины, формат записи будет также переменной длины. Обратите внимание, что, когда таблица создана, MySQL может, при некоторых условиях, изменять столбец с типа переменной длины на тип фиксированной длины. Подробности в разделе "7.3.1 Тихие изменения спецификации столбца".

Размер объекта ENUM определен числом различных значений перечисления. Один байт используется для перечислений до 255 возможных значений. Два байта используются для перечислений до 65535 значений. Подробности в разделе "5.3.3 Тип ENUM ".

Размер объекта SET определен числом различных членов набора. Если размер набора равен N, то объект занимает (N+7)/8 байт, округленных до 1, 2, 3, 4 или 8 байт. SET может иметь максимум до 64 членов. Подробности приведены в разделе "5.3.4 Тип SET".




Спонсоры:
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2021 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру