чувствительный к регистру mysql в utf8 general ci

у меня есть база данных mysql, где я использую utf8_general_ci (то есть без учета регистра), и в моих таблицах у меня есть некоторые столбцы, такие как ID с учетом регистра (пример: 'iSZ6fX' или 'AscSc2')

чтобы отличить верхний регистр от нижнего, лучше установить на эти столбцы только utf8_bin, например:

CREATE TABLE  `test` (
`id` VARCHAR( 32 ) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL ,
`value1` VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL
) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci

или используйте utf8_general_ci для всех столбцов и используйте 'BINARY' в запросе php, например:

mysqli_query( $link, "SELECT * FROM table WHERE BINARY id = 'iSZ6fX'" );

3 ответов


лучше использовать utf8_bin сопоставление, потому что, хотя это невозможно в UTF-8, в общем случае это теоретически возможно (например, с UTF-16) для то же самое строка, которая будет представлена разные кодировки, которые двоичное сравнение не поймет, но двоичная сортировка будет. Как задокументировано в разделе Набор Символов Unicode:

существует разница между " заказом по значение кода символа " и "упорядочение по двоичному представлению символа", разница, которая появляется только с utf16_bin, из-за суррогатов.

предположим, что utf16_bin (двоичная сортировка для utf16) было двоичное сравнение "байт за байтом", а не " символ за символом.- Если это так, то порядок знаков в utf16_bin будет отличаться от порядка в utf8_bin. Например, на следующей диаграмме показаны два редких символа. Первый персонаж в серии E000-FFFF, поэтому он больше, чем суррогат, но меньше, чем дополнительный. Второй символ является дополнительным.

Code point  Character                    utf8         utf16
----------  ---------                    ----         -----
0FF9D       HALFWIDTH KATAKANA LETTER N  EF BE 9D     FF 9D
10384       UGARITIC LETTER DELTA        F0 90 8E 84  D8 00 DF 84

два символа на диаграмме расположены в порядке по значению кодовой точки, потому что 0xff9d 0x10384. И они в порядке utf8 значение, потому что 0xef 0xf0. Но они не в порядке utf16 значение, если мы используем побайтовое сравнение, потому что 0xff>0xd8.

Итак, MySQL utf16_bin параметры не "байт байт."Это" по кодовому пункту."Когда MySQL видит дополнительную кодировку символов в utf16, он преобразуется в значение кодовой точки символа, а затем сравнивает. Следовательно,utf8_bin и utf16_bin тот же порядок. Это согласуется со стандартным требованием SQL: 2008 для сортировки UCS_BASIC: "ucs_basic-это сортировка, в которой порядок определяется полностью скалярными значениями Unicode символов в сортируемых строках. Он применим к символу UCS репертуар. Поскольку каждый репертуар символов является подмножеством репертуара UCS, параметры сортировки UCS_BASIC потенциально применимы к каждому набору символов. Примечание 11: скалярное значение Unicode символа-это его кодовая точка, рассматриваемая как целое число без знака."

поэтому, если сравнения с участием этих столбцов всегда учитывайте регистр, вы должны установить параметры сортировки столбца в utf8_bin (Так, что они останутся чувствительными к регистру, даже если вы забыли укажите иное в запросе); или если только определенные запросы чувствительны к регистру, вы можете указать, что utf8_bin параметры сортировки следует использовать с помощью COLLATE ключевые слова:

SELECT * FROM table WHERE id = 'iSZ6fX' COLLATE utf8_bin

лучше использовать столбцы с utf8_bin, а не указать условие в запросе, потому что это уменьшает вероятность ошибок.


эффект двоичного как атрибут столбца отличается от его эффекта до MySQL 4.1. Ранее BINARY приводил к столбцу, который обрабатывался как двоичная строка. Двоичная строка-это строка байтов, не имеющая набора символов или параметров сортировки, которая отличается от небинарной символьной строки с двоичными параметрами сортировки.

А Теперь

бинарный оператор строковый после его двоичную строку. Это простой способ заставить сравнение быть выполненным byte по байтам, а не по символам. BINARY также заставляет конечные пробелы быть значительными. Двоичный str является сокращением для CAST (str как двоичный).

двоичный атрибут в определениях столбцов символов имеет другой эффект. Столбцу символов, определенному с помощью двоичного атрибута, назначается двоичная сортировка набора символов столбца. Каждый набор символов имеет двоичную сортировку. Например, двоичные параметры сортировки для набора символов latin1-latin1_bin, поэтому если таблица набор символов по умолчанию-latin1, эти два определения столбцов эквивалентны:

CHAR(10) BINARY

CHAR(10) CHARACTER SET latin1 COLLATE latin1_bin