чувствительный к регистру 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