Spec-Zone.ru › MySQL 5.7

11.3.3 Типы BINARY и VARBINARY

Типы BINARY и VARBINARY похожи на CHAR и VARCHAR, за исключением того, что они хранят двоичные строки, а не недвоичные. То есть, они хранят байтовые строки, а не строковые. Это означает, что у них есть binary набор символов и сортировка, а сравнение и сортировка основаны на числовых значениях байтов в значениях.

Допустимая максимальная длина для BINARY и VARBINARY такая же, как для CHAR и VARCHAR, за исключением того, что длина BINARY и VARBINARY измеряется в байтах, а не в символах.

Типы данных BINARY и VARBINARY отличаются от типов данных CHAR и VARCHAR. Для последних типов атрибут BINARY не заставляет столбец обрабатываться как двоичный столбец. Вместо этого он заставляет использовать двоичную (_bin) сортировку для набора символов столбца (или по умолчанию для таблицы, если набор символов столбца не указан), и сам столбец хранит недвоичные строковые символы, а не двоичные байтовые строки. Например, если набор символов по умолчанию - latin1, то CHAR(5) BINARY обрабатывается как CHAR(5) CHARACTER SET latin1 COLLATE latin1_bin. Это отличается от BINARY, который хранит 5-байтовые двоичные строки с binary набором символов и сортировкой. Более подробную информацию о различиях между сортировкой binary набора символов binary и сортировками _bin недвоичных наборов символов см. в Разделе 10.8.5, «Двоичная сортировка по сравнению с _bin».

Если строгий режим SQL не включен, и вы присваиваете столбцу BINARY или VARBINARY значение, превышающее максимальную длину столбца, значение усекается до соответствия, и генерируется предупреждение. Для случаев усечения, чтобы произошла ошибка (а не предупреждение) и подавить вставку значения, используйте строгий режим SQL. См. Раздел 5.1.10, «Режим сервера SQL».

При хранении значений BINARY они дополняются справа значением заполнения до указанной длины. Значение заполнения - 0x00 (нулевой байт). Значения дополняются справа 0x00 для вставок, и при извлечении конечные байты не удаляются. Все байты имеют значение в сравнениях, включая ORDER BY и DISTINCT операции. 0x00 и пробел отличаются в сравнениях, причем 0x00 сортируется перед пробелом.

Пример: для столбца BINARY, 'a ' становится 'a \0' при вставке. 'a\0' становится 'a\0\0' при вставке. Оба вставленных значения остаются неизменными при извлечении.

Для VARBINARY нет заполнения при вставке и байты не удаляются при извлечении. Все байты значимы при сравнениях, включая ORDER BY и DISTINCT операции. 0x00 и пробел отличаются в сравнениях, причем 0x00 сортируется перед пробелом.

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

Вы должны тщательно учитывать упомянутые характеристики заполнения и удаления, если планируете использовать тип данных BINARY для хранения двоичных данных и вам необходимо, чтобы извлеченное значение было точно таким же, как сохраненное. Следующий пример иллюстрирует, как 0x00-заполнение значений BINARY влияет на сравнение значений столбца:

mysql> CREATE TABLE t (c BINARY(3));
Query OK, 0 rows affected (0.01 sec)

mysql> INSERT INTO t SET c = 'a';
Query OK, 1 row affected (0.01 sec)

mysql> SELECT HEX(c), c = 'a', c = 'a\0\0' from t;
+--------+---------+-------------+
| HEX(c) | c = 'a' | c = 'a\0\0' |
+--------+---------+-------------+
| 610000 |       0 |           1 |
+--------+---------+-------------+
1 row in set (0.09 sec)

Если извлеченное значение должно быть таким же, как указанное при хранении без заполнения, предпочтительнее использовать VARBINARY или один из типов данных BLOB или TEXT.

Примечание

В клиенте mysql двоичные строки отображаются с использованием шестнадцатеричного представления, в зависимости от значения --binary-as-hex. Более подробную информацию об этом параметре см. в Разделе 4.5.1, «mysql — Клиент MySQL командной строки».

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

Spec-Zone.ru

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