6.2.3.1 Типы данных CHAR и VARCHAR
Типы данных 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
во
время создания таблицы. See section 6.5.3.1 Молчаливые изменения определений столбцов.