Spec-Zone .ru
спецификации, руководства, описания, API
|
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 '
вызывает
двойную ключевую ошибку.