Spec-Zone.ru › MySQL 5.7

11.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 байт, который делится между всеми столбцами) и используемой кодовой страницы. См. Раздел 8.4.7, «Ограничения на количество столбцов таблицы и размер строки».

В отличие от CHAR, значения VARCHAR хранятся как префикс длины (1 или 2 байта) плюс данные. Префикс длины указывает количество байт в значении. Столбец использует один байт для длины, если значения занимают не более 255 байт, и два байта, если значения могут занимать более 255 байт.

Если режим strict SQL не включён, и вы присваиваете значение столбцу CHAR или VARCHAR, которое превышает максимальную длину столбца, значение усекается до подходящей длины, и генерируется предупреждение. Для усечения символов, отличных от пробелов, вы можете вызвать ошибку (вместо предупреждения) и предотвратить вставку значения, используя режим strict SQL. См. Раздел 5.1.10, «Режимы 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. Это означает, что все значения CHAR, VARCHAR и TEXT сравниваются без учёта хвостовых пробелов. “Сравнение” в данном контексте не включает оператор соответствия по шаблону LIKE, для которого хвостовые пробелы имеют значение. Например:

mysql> CREATE TABLE names (myname CHAR(10));
Query OK, 0 rows affected (0.03 sec)

mysql> INSERT INTO names VALUES ('Jones');
Query OK, 1 row affected (0.00 sec)

mysql> SELECT myname = 'Jones', myname = 'Jones  ' FROM names;
+------------------+--------------------+
| myname = 'Jones' | myname = 'Jones  ' |
+------------------+--------------------+
|                1 |                  1 |
+------------------+--------------------+
1 row in set (0.00 sec)

mysql> SELECT myname LIKE 'Jones', myname LIKE 'Jones  ' FROM names;
+---------------------+-----------------------+
| myname LIKE 'Jones' | myname LIKE 'Jones  ' |
+---------------------+-----------------------+
|                   1 |                     0 |
+---------------------+-----------------------+
1 row in set (0.00 sec)

Это не зависит от режима SQL сервера.

Примечание

Дополнительную информацию о кодовых страницах и сортировках MySQL см. в Главе 10, «Кодовые страницы, сортировки, Unicode». Дополнительную информацию о требованиях к хранению см. в Разделе 11.7, «Требования к хранению типов данных».

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

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/char.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API