13.3.2 Типы CHAR и VARCHAR
Типы CHAR и VARCHAR похожи, но различаются способом хранения и извлечения данных. Они также различаются максимальной длиной и сохранением хвостовых пробелов.
Типы CHAR и VARCHAR объявляются с длиной, указывающей максимальное количество символов, которые вы хотите сохранить. Например, CHAR(30) может содержать до 30 символов.
Длина столбца CHAR фиксируется при создании таблицы. Длина может быть любым значением от 0 до 255. При хранении значений CHAR они дополняются пробелами справа до указанной длины. При извлечении значений CHAR хвостовые пробелы удаляются, если не включён режим SQL PAD_CHAR_TO_FULL_LENGTH.
Значения в столбцах VARCHAR представляют собой строки переменной длины. Длина может быть указана как значение от 0 до 65 535. Эффективная максимальная длина VARCHAR зависит от максимального размера строки (65 535 байт, который используется всеми столбцами) и используемой кодировки символов. См. Раздел 10.4.7, «Ограничения на количество столбцов таблицы и размер строки».
В отличие от CHAR, значения VARCHAR хранятся как префикс длины в 1 или 2 байта плюс данные. Префикс длины указывает количество байтов в значении. Столбец использует один байт длины, если значения занимают не более 255 байтов, и два байта длины, если значения могут занимать более 255 байтов.
Если режим строгого SQL не включён, и вы присвоите значение столбцу CHAR или VARCHAR, превышающее максимальную длину столбца, значение усекается для соответствия, и генерируется предупреждение. Для усечения символов, не являющихся пробелами, можно вызвать ошибку (вместо предупреждения) и запретить вставку значения, используя режим строгого SQL. См. Раздел 7.1.11, «Режимы SQL сервера».
Для столбцов VARCHAR хвостовые пробелы, превышающие длину столбца, усекаются перед вставкой, и генерируется предупреждение, независимо от используемого режима SQL. Для столбцов CHAR усечение избыточных хвостовых пробелов из вставляемых значений происходит без сообщений, независимо от режима SQL.
Значения VARCHAR не дополняются при хранении. Хвостовые пробелы сохраняются при хранении и извлечении значений в соответствии со стандартным SQL.
Следующая таблица иллюстрирует различия между CHAR и VARCHAR, показывая результат хранения различных строковых значений в столбцах CHAR(4) и VARCHAR(4) (предполагая, что столбец использует кодировку символов с одним байтом, например, latin1).
| Значение | CHAR(4) | Требуемое хранение | VARCHAR(4) | Требуемое хранение |
|---|---|---|---|---|
'' | ' ' | 4 байта | '' | 1 байт |
'ab' | 'ab ' | 4 байта | 'ab' | 3 байта |
'abcd' | 'abcd' | 4 байта | 'abcd' | 5 байт |
'abcdefgh' | 'abcd' | 4 байта | 'abcd' | 5 байт |
Значения, показанные как сохранённые в последней строке таблицы, применяются только при отсутствии режима строгого SQL; если режим строгий включён, значения, превышающие длину столбца, не хранятся, и возникает ошибка.
InnoDB кодирует поля фиксированной длины, превышающие или равные 768 байтам, как поля переменной длины, которые могут храниться вне страницы. Например, столбец CHAR(255) может превышать 768 байт, если максимальная длина байта кодировки символов превышает 3, как это происходит в utf8mb4.
Если заданное значение хранится в столбцах CHAR(4) и VARCHAR(4), извлеченные значения из столбцов не всегда совпадают, потому что хвостовые пробелы из столбцов CHAR удаляются при извлечении. Следующий пример иллюстрирует это различие:
mysql> CREATE TABLE vc (v VARCHAR(4), c CHAR(4));
Query OK, 0 rows affected (0.01 sec)
mysql> INSERT INTO vc VALUES ('ab ', 'ab ');
Query OK, 1 row affected (0.00 sec)
mysql> SELECT CONCAT('(', v, ')'), CONCAT('(', c, ')') FROM vc;
+---------------------+---------------------+
| CONCAT('(', v, ')') | CONCAT('(', c, ')') |
+---------------------+---------------------+
| (ab ) | (ab) |
+---------------------+---------------------+
1 row in set (0.06 sec)
Значения в столбцах CHAR, VARCHAR и TEXT сортируются и сравниваются в соответствии с набором символов сортировки, назначенным столбцу.
MySQL сортировки имеют атрибут дополнения PAD
SPACE, за исключением сортировок Юникода на основе UCA 9.0.0 и выше, которые имеют атрибут дополнения NO
PAD. (см. Раздел 12.10.1, «Наборы символов Unicode»).
Для определения атрибута дополнения для сортировки используйте таблицу INFORMATION_SCHEMA COLLATIONS, которая имеет столбец PAD_ATTRIBUTE.
Для строковых значений без бинарного представления (значений CHAR, VARCHAR и TEXT) атрибут дополнения сортировки строки определяет обработку хвостовых пробелов в конце строк при сравнении. Сортировки NO PAD рассматривают хвостовые пробелы как значимые при сравнении, как и любой другой символ. Сортировки PAD SPACE рассматривают хвостовые пробелы как незначимые при сравнении; строки сравниваются без учёта хвостовых пробелов. См. Обработку хвостовых пробелов при сравнении. Режим SQL сервера не влияет на поведение сравнения относительно хвостовых пробелов.
Дополнительную информацию о наборах символов и сортировках MySQL см. в Главе 12, Наборы символов, сортировки, Unicode. Дополнительную информацию о требованиях к хранению см. в Разделе 13.7, «Требования к хранению типов данных».
В тех случаях, когда хвостовые символы заполнения удаляются или сравнения их игнорируют, если столбец имеет индекс, требующий уникальных значений, вставка в столбец значений, отличающихся только количеством хвостовых символов заполнения, приводит к ошибке дублирования ключа. Например, если таблица содержит 'a', попытка сохранить 'a ' приводит к ошибке дублирования ключа.
© 2025 Oracle
Licensed under the GPLv2 License.