Начиная с версии 4,1.2, типы CHAR и VARCHAR рассматривают строки как последовательности символов. Это означает, что при использовании многобайтных кодировок, например UNICODE, размер строки в байтах будет больше, чем в символах. Для совместимости со старыми версиями в MySQL введены два специальных типа: BINARY и VARBINARY, которые эквивалентны типам CHAR и VARCHAR, но строка в них рассматривается как последовательность байтов, а не символов. К BiNARY-строкам не применимы кодировки и сортируются они как обычные последовательности байтов.
Типы BLOB и TEXT в СУБД MySQL во всем аналогичны и отличаются только в деталях. Например, при выполнении операций над столбцами типа text учитывается кодировка, а типа BLOB — нет.
Тип TEXT обычно используется для хранения больших объемов текста, в то время как BLOB — для больших двоичных объектов, таких как электронные документы, изображения, звуки и т. д.
К особым типам данных относятся ENUM и SET. Строки этих типов принимают значения из заранее заданного списка допустимых значений. Основное различие между ними заключается в том, что значение типа ENUM должно содержать точно одно значение из указанного множества, тогда как столбцы SET могут содержать любой или все элементы заранее заданного множества одновременно. Так, значения для столбца, объявленного как ENUM('у','n'), могут принимать только два значения: либо 'у', либо 'n'.
Для типа SET, так же как и для типа ENUM, при объявлении задается список возможных значений, но ячейка может принимать любое значение из списка, а пустая строка означает, что ни один из элементов списка не выбран. Например, значения для столбца SET(‘y’, ‘n’) могут принимать значения ('у','n'), (‘у'), ('n') и пустое множество ( ).
Типы ENUM и SET можно назвать строковыми лишь отчасти, т. к. при объявлении они задаются списком строк, но во внутреннем представлении базы данных элементы множеств сохраняются в виде чисел. Элементы типа ENUM нумеруются последовательно, начиная с 1. В зависимости от числа элементов в списке под столбец может отводиться 1 байт (до 256 элементов в списке) или 2 байта (от 257 до 65536 элементов в списке).
Элементы множества SET обрабатываются как биты, размер типа при этом также определяется числом элементов в списке: 1 байт (от 1 до 8 элементов), 2 байта (от 9 до 16 элементов), 3 байта (от 17 до 24 элементов), 4 байта (от 25 до 32 элементов) и 8 байт (от 33 до 64 элементов).
СУБД MySQL имеет 5 видов столбцов для хранения календарных типов данных: DATE, DATETIME, TIME, TIMESTAMP и YEAR (табл. 5). Тип DATE предназначен для хранения даты, TIME для времени суток, a TIMESTAMP для представления и даты, и времени суток. Тип TIMESTAMP предназначен для представления даты и времени суток в виде числа секунд, прошедших с полуночи 1 января 1970 года. Тип данных year позволяет хранить только год.
Таблица 5. Календарные типы данных
Для значений, имеющих тип DATE и DATETIME, в качестве первой цифры ожидается год либо в формате "YYYY", например '2005-10-15', либо в формате "YY", например
'05-10-15'. После года через дефис указывается месяц в формате "ММ" (10), а затем день в формате "DD" (15).
В типах TIME и DATETIME время приводится в привычном формате hh:mm:ss, где hh — часы, mm — минуты, a ss — секунды. Дни, месяцы, часы, минуты и секунды можно записывать как с ведущим нулем: 01, так и без него: 1.-Например, все следующие записи идентичны:
'2005-04-06 02:04:08'
'2005-4-06 02:04:08'
'2005-4-6 02:04:08'
'2005-4-6 2:04:08'
'2005-4-6 2:4:08'
'2005-4-6 2:4:8'
В качестве разделителя между годами, месяцами, днями, часами, минутами, секундами может выступать любой символ, отличный от цифры. Так, следующие значения идентичны:
'05-12-31 11:30:45'
'05.12.31 11+30+45'
'05/12/31 11*30*45'
'05@12@31 11^30^45'
Дата и время суток могут также быть представлены в форматах 'YYYYMMDDhhmmss' и YYMMDDhhmmss'. Например, строки '2005091528' и '050523091528' аналогичны '2005-05-23 09:15:28', однако строка '051122129015' уже не может рассматриваться как дата и время суток, т. к. значение для минут равно 90 и выходит за допустимый интервал. Вместо строк допустимы и целочисленные значения, например, 2005091528 и 0523091528 рассматриваются как '2005-05-23 09:15:28'.
Начиная с версии MySQL 4.1.1, при указании времени суток после секунд через точку можно также указать микросекунды, т.е. использовать расширенный формат вида 'hh:mm:ss.ffffrr’, например '10:25:14.000001'. Кроме расширенного формата, можно использовать краткие форматы 'НН:ММ' и 'НН' — вместо пропущенных величин будут подставлены нулевые значения.
Если время задается в недопустимом формате, то в поле записывается нулевое значение. Нулевое значение присваивается полям временного типа по умолчанию, когда им не присваивается инициирующее значение (табл. 6).
Формат типа timestamp совпадает с DATETIME, но во внутреннем представлении дата хранится в виде секунд, прошедших с полуночи 1 января 1970 года.
Если в таблице несколько столбцов TIMESTAMP, при модификации записи текущее время будет записываться только в один из столбцов (по умолчанию первый). Можно также указать явно столбец, которому необходимо назначать текущую дату при создании новой записи или изменении старой. Для того чтобы поля столбца принимали текущую дату при создании новой записи, следует после определения столбца добавить запись DEFAULT CURRENT_TIMESTAMP. Если требуется, чтобы текущее время выставлялось при модификации уже существующей записи, при использовании оператора update следует добавить конструкцию on update CURRENT_TIMESTAMP.