CHAR и VARCHAR
http://www.mysql.ru/docs/man/CHAR.html
Типы данных CHAR
и VARCHAR
очень схожи между собой, но различаются по способам их хранения и извлечения.
В столбце типа CHAR
длина поля постоянна и задается при создании таблицы. Эта длина может принимать любое значение между 1 и 255 (что же касается версии MySQL 3.23, то в ней длина столбца CHAR
может быть от 0 до 255). Величины типа CHAR
при хранении дополняются справа пробелами до заданной длины. Эти концевые пробелы удаляются при извлечении хранимых величин.
Величины в столбцах VARCHAR
представляют собой строки переменной длины. Так же как и для столбцов CHAR, можно задать столбец VARCHAR
любой длины между 1 и 255. Однако, в противоположность CHAR, при хранении величин типа VARCHAR
используется только то количество символов, которое необходимо, плюс один байт для записи длины. Хранимые величины пробелами не дополняются, наоборот, концевые пробелы при хранении удаляются (описанный процесс удаления пробелов отличается от предусмотренного спецификацией 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
удаляются.
Если при создании таблицы не был задан атрибут BINARY для столбцов, то величины в столбцах типа CHAR
и VARCHAR
сортируются и сравниваются без учета регистра. При задании атрибута BINARY величины в столбце сортируются и сравниваются с учетом регистра в соответствии с порядком таблицы ASCII на том компьютере, где работает сервер MySQL. Атрибут BINARY не влияет на процессы хранения или извлечения данных из столбца.
Атрибут BINARY является прилипчивым
. Это значит, что, если в каком-либо выражении использовать столбец, помеченный как BINARY, то сравнение всего выражения будет выполняться как сравнение величины типа BINARY.
MySQL может без предупреждения изменить тип столбца CHAR
или VARCHAR
во время создания таблицы.
Молчаливые изменения определений столбцов
http://www.mysql.ru/docs/man/Silent_column_changes.html
В некоторых случаях MySQL без уведомления изменяет определение столбца, заданное командой CREATE TABLE
(Это может осуществляться также для команды ALTER TABLE
):
- столбец
VARCHAR
с длиной меньше, чем4
, преобразуется в столбецCHAR
.
Если некоторый столбец в таблице имеет переменную длину, то и вся строка в результате будет переменной длины. Следовательно, если таблица содержит любые столбцы переменной длины (VARCHAR
, TEXT
или ‘‘BLOB’’), то все столбцы CHAR
с длиной, превышающей три символа, преобразуются в столбцы VARCHAR. Это в любом случае не влияет на использование столбцов; в MySQL столбец VARCHAR
представляет собой просто иной способ хранения символов. MySQL выполняет данное преобразование, поскольку оно позволяет сэкономить память и сделать табличные операции более быстрыми. See section 7 Типы таблиц MySQL.
Количество выводящихся символов столбца TIMESTAMP
должно быть четным и находиться в диапазоне от 2 до 14. При задании размера вывода, равного 0 или превышающего 14, указанный размер приводится к 14. Нечетные величины размера вывода в пределах от 1 до 13 приводятся к следующему четному числу.
В столбце TIMESTAMP
не может храниться литерал NULL; установка данного столбца в NULL устанавливает его в текущее значение даты и времени. Поскольку столбцы TIMESTAMP
ведут себя подобным образом, то атрибуты NULL и NOT NULL неприменимы в обычном режиме и игнорируются при их задании. DESCRIBE tbl_name всегда сообщает, что столбцу TIMESTAMP
могут быть присвоены величины NULL.
MySQL приводит в соответствие определенные типы столбцов, используемые другими производителями баз данных SQL, к типам, принятым в MySQL. See section 6.2.5 Использование типов столбцов из других баз данных.
Если необходимо увидеть, использует ли MySQL иной тип столбца, чем был первоначально задан, следует запустить команду DESCRIBE tbl_name после создания или изменения данной таблицы.
Некоторые другие изменения типов столбцов могут происходить при сжатии таблицы с использованием утилиты myisampack. See section 7.1.2.3 Характеристики сжатых таблиц.