Spec-Zone .ru
спецификации, руководства, описания, API

11.4.1. CHAR и VARCHAR Типы

CHAR и VARCHAR типы подобны, но отличаются по способу, которым они сохранены и получаются. Они также отличаются по максимальной длине и по тому, сохраняются ли конечные пробелы.

CHAR и VARCHAR типы объявляются с длиной, которая указывает на максимальное количество символов, которые Вы хотите сохранить. Например, CHAR(30) может содержать до 30 символов.

Длина a CHAR столбец фиксируется к длине, которую Вы объявляете, когда Вы составляете таблицу. Длина может быть любым значением от 0 до 255. Когда CHAR значения сохранены, они дополняются правом пробелами к указанной длине. Когда CHAR значения получаются, конечные пробелы не удаляются если PAD_CHAR_TO_FULL_LENGTH Режим SQL включается.

Значения в VARCHAR столбцы являются строками переменной длины. Длина может быть определена как значение от 0 до 65 535. Эффективная максимальная длина a VARCHAR подвергается максимальному размеру строки (65 535 байтов, который совместно используется среди всех столбцов), и используемый набор символов. См. Раздел E.10.4, "Пределы на Столбце таблицы граф и Размер Строки".

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

Если строгий режим SQL не включается, и Вы присваиваете значение a CHAR или VARCHAR столбец, который превышает максимальную длину столбца, значение, является усеченным, чтобы соответствовать, и предупреждение сгенерировано. Для усечения непробелов можно вызвать ошибку произойти (а не предупреждение) и подавить вставку значения при использовании строгого режима SQL. См. Раздел 5.1.7, "Режимы 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 байтов

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

Если данное значение сохранено в 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 столбцы сортируются и сравниваются согласно сопоставлению набора символов, присвоенному столбцу.

Все сопоставления MySQL имеют тип PADSPACE. Это означает что все CHAR, VARCHAR, и TEXT значения в MySQL сравниваются без отношения с любыми конечными пробелами. "Сравнение" в этом контексте не включает LIKE оператор сопоставления с образцом, для которого конечные пробелы являются существенными. Например:

mysql> CREATE TABLE names (myname
        CHAR(10));Query OK, 0 rows affected (0.03 sec)mysql> INSERT
        INTO names VALUES ('Monty');Query OK, 1 row affected (0.00 sec)mysql> SELECT myname = 'Monty', myname = 'Monty ' FROM names;+------------------+--------------------+| myname = 'Monty' | myname = 'Monty  ' |+------------------+--------------------+|                1 |                  1 |+------------------+--------------------+1 row in set (0.00 sec)mysql> SELECT myname LIKE 'Monty', myname LIKE 'Monty ' FROM names;+---------------------+-----------------------+| myname LIKE 'Monty' | myname LIKE 'Monty  ' |+---------------------+-----------------------+|                   1 |                     0 |+---------------------+-----------------------+1 row in set (0.00 sec)

Это - истина для всех версий MySQL, и не влияется режимом SQL сервера.

Отметить

Для получения дополнительной информации о наборах символов MySQL и сопоставлениях, см. Раздел 10.1, "Поддержка Набора символов".

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