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

10.1.7.6. _bin и binary Сопоставления

Этот раздел описывает как _bin сопоставления для недвоичных строк отличаются от binary "сопоставление" для двоичных строк.

Недвоичные строки (как сохраненный в CHAR, VARCHAR, и TEXT типы данных), имеют набор символов и сопоставление. У данного набора символов может быть несколько сопоставлений, каждое из которых определяет определенную сортировку и порядок сравнения на символы в наборе. Один из них является двоичным сопоставлением для набора символов, обозначенного a _bin суффикс на имя сопоставления. Например, latin1 и utf8 назовите двоичные сопоставления latin1_bin и utf8_bin.

Двоичные строки (как сохраненный в BINARY, VARBINARY, и BLOB типы данных), не имеют никакого набора символов или сопоставления в том смысле, что недвоичные строки делают. (Примененный к двоичная строка, CHARSET() и COLLATION() функции оба возвращают значение binary.) Двоичные строки являются последовательностями байтов, и числовые значения тех байтов определяют порядок сортировки.

_bin сопоставления отличаются от binary сопоставление в нескольких отношениях.

Модуль для сортировки и сравнения. Двоичные строки являются последовательностями байтов. Сортировка и сравнение всегда основана на числовых значениях байта. Недвоичные строки являются последовательностями символов, которые могли бы быть многобайтовыми. Сопоставления для недвоичных строк определяют упорядочивание символьных значений для сортировки и сравнения. Для _bin сопоставление, это упорядочивание базируется исключительно на значениях двоичного кода символов (который подобен упорядочиванию для двоичных строк за исключением того, что a _bin сопоставление должно принять во внимание, что символ мог бы содержать многократные байты). Для других сопоставлений символьное упорядочивание могло бы взять дополнительные факторы, такие как lettercase во внимание.

Преобразование набора символов. Недвоичная строка имеет набор символов и преобразовывается в другой набор символов во многих случаях, даже когда у строки есть a _bin сопоставление:

Для столбцов двоичной строки не происходит никакое преобразование. Для предыдущих случаев строковое значение копируется мудрое байтом.

Преобразование Lettercase. Сопоставления предоставляют информацию о lettercase символов, таким образом, символы в недвоичной строке могут быть преобразованы от одного lettercase до другого, даже для _bin сопоставления, которые игнорируют lettercase для того, чтобы упорядочить:

mysql> SET NAMES latin1 COLLATE
        latin1_bin;Query OK, 0 rows affected (0.02 sec)mysql> SELECT
        LOWER('aA'), UPPER('zZ');+-------------+-------------+| LOWER('aA') | UPPER('zZ') |+-------------+-------------+| aa          | ZZ          |+-------------+-------------+1 row in set (0.13 sec)

Понятие lettercase не применяется к байтам в двоичной строке. Чтобы выполнить lettercase преобразование, строка должна быть преобразована в недвоичную строку:

mysql> SET NAMES binary;Query OK, 0 rows affected (0.00 sec)mysql> SELECT LOWER('aA'), LOWER(CONVERT('aA' USING latin1));+-------------+-----------------------------------+| LOWER('aA') | LOWER(CONVERT('aA' USING latin1)) |+-------------+-----------------------------------+| aA          | aa                                |+-------------+-----------------------------------+1 row in set (0.00 sec)

Обработка конечного пробела в сравнениях. Недвоичные строки имеют PADSPACE поведение для всех сопоставлений, включая _bin сопоставления. Конечные пробелы являются незначащими в сравнениях:

mysql> SET NAMES utf8 COLLATE
        utf8_bin;Query OK, 0 rows affected (0.00 sec)mysql> SELECT 'a
        ' = 'a';+------------+| 'a ' = 'a' |+------------+|          1 |+------------+1 row in set (0.00 sec)

Для двоичных строк все символы являются существенными в сравнениях, включая конечные пробелы:

mysql> SET NAMES binary;Query OK, 0 rows affected (0.00 sec)mysql> SELECT 'a ' = 'a';+------------+| 'a ' = 'a' |+------------+|          0 |+------------+1 row in set (0.00 sec)

Обработка конечного пробела для вставок и извлечения. CHAR(N) столбцы хранят недвоичные строки. Значения короче чем N символы расширяются с помощью пробелов на вставке. Для извлечения удаляются конечные пробелы.

BINARY(N) столбцы хранят двоичные строки. Значения короче чем N байты расширяются с помощью 0x00 байты на вставке. Для извлечения ничто не удаляется; значение объявленной длины всегда возвращается.

mysql> CREATE TABLE t1
        (    ->  a CHAR(10) CHARACTER SET utf8 COLLATE
        utf8_bin,    ->  b
        BINARY(10)    -> );Query OK, 0 rows affected (0.09 sec)mysql> INSERT INTO t1 VALUES ('a','a');Query OK, 1 row affected (0.01 sec)mysql> SELECT HEX(a), HEX(b) FROM t1;+--------+----------------------+| HEX(a) | HEX(b)               |+--------+----------------------+| 61     | 61000000000000000000 |+--------+----------------------+1 row in set (0.04 sec)