В MySQL / MariaDB сортировка без учета регистра по-прежнему чувствительна к регистру? - PullRequest
0 голосов
/ 25 января 2019

Используя MariaDB 10.0.36, у меня есть пользовательская таблица с сопоставлением utf8_turkish_ci со столбцом user_login, в которой хранится имя пользователя, которое также использует сопоставление utf8_turkish_ci с уникальным индексом.

Насколько я понимаю, оператор select должен быть нечувствительным к регистру, но с определенными именами пользователей это не так.

Например, у меня есть пользователь с логином GoDoIt

Этот оператор не возвращает записей:

SELECT * FROM user WHERE user_login = 'godoit'

Однако это работает:

SELECT * FROM user WHERE user_login = 'GoDoIt'

Я нахожу это страннымпотому что имя пользователя Eric работает в обоих направлениях.

SELECT * FROM user WHERE user_login = 'eric' SELECT * FROM user WHERE user_login = 'Eric'

Вернуть тот же результат.Так почему заглавные буквы в середине строки не работают?Я опускаю входное имя пользователя в PHP с помощью tolower в строке перед отправкой в ​​базу данных, и я полагаю, что этот подход не будет работать с определенными именами пользователей.

Ответы [ 2 ]

0 голосов
/ 26 января 2019

(Слишком длинный для комментария. Ответ Спенсера хорош.)

В этом перечислены буквы и состояния, которые равны или нет, и в каком порядке ониВот отрывок, показывающий, что точки без точек равны друг другу, но считаются меньшими, чем точки с точками:

utf8_turkish_ci   I=ı  Ħ=ħ  i=Ì=Í=Î=Ï=ì=í=î=ï=Ĩ=ĩ=Ī=ī=Ĭ=ĭ=Į=į=İ  ij=IJ=ij   iz J=j=j́=Ĵ=ĵ  jz

Некоторые другие особенности, которые необычны в utf8_turkish_ci: Ö=ö -- обрабатывается как «буква» между O и P. Аналогично для for = ç и Ğ=ğ и Ş=ş

Примечание: utf8mb4 и utf8 обрабатывают турецкий язык одинаково.

MySQL 6.0умер на корню лет назад;похоже, что ссылка для сопоставления устарела в отношении Ş:

mysql> SELECT 'Ş' = 'S' COLLATE utf8_turkish_ci;
+------------------------------------+
| 'Ş' = 'S' COLLATE utf8_turkish_ci  |
+------------------------------------+
|                                  0 |
+------------------------------------+
0 голосов
/ 25 января 2019

Турецкий I без точек и I с двумя точками; они не считаются равными в сопоставлении utf8_turkish_ci.

enter image description here

См. Таблицу сопоставления здесь: http://collation -charts.org / mysql60 / mysql604.utf8_turkish_ci.html

Обратите внимание на отдельные записи для точки без точки I и точки с точками I.

Дополнительный фон здесь: https://en.wikipedia.org/wiki/Dotted_and_dotless_I

...