Как MySQL работает «без учета регистра» и «без учета ударения» в UTF-8

У меня есть схема в "utf8 -- UTF-8 Unicode" в качестве набора символов и сопоставление "utf8_spanish_ci".

Все внутренние таблицы представляют собой InnoDB с такой же кодировкой и сопоставлением, как указано.

А вот и проблема:

с таким запросом, как

SELECT *
FROM people p
WHERE p.NAME LIKE '%jose%';

, я получаю 83 строки результатов. У меня должно быть 84 результата, потому что я это знаю.

Изменение where для:

WHERE p.NAME LIKE '%JOSE%';

Я получаю точно такие же 83 строки. С такими комбинациями, как JoSe, Jose, JOSe и т. д. сообщается все те же 83 строки.

Проблема возникает, когда в игре играют акценты.Если сделать:

WHERE p.NAME LIKE '%josé%';

Я не получаю результатов. 0 строк.

Но если я это сделаю:

WHERE p.NAME LIKE '%JOSÉ%';

Я получу только одну результирующую строку, то есть 1 строку. Это единственная строка, в которой "хосе" выделено ударением и написано с заглавной буквы.

Я пробовал с josÉ, или JoSÉ, или любой другой комбинацией, пока акцентированная буква остается заглавной или нет, поскольку она действительно хранится в базе данных и по-прежнему возвращает единственную строку. Если я внезапно заменю «É» на «é» в любой комбинации, которую я делаю с заглавными буквами в JOSE, он не возвращает строк.

Итак, выводы:

  • Нечувствителен к регистру, если в игре нет латинских символов.
  • Регистрозависимо, если появляются латинские символы.
  • С учетом акцента, как будто я ищу JOSE или jose, я получаю только 83 строки вместо 84 строк, которые мне нужны.

Чего я хочу?

  • Для поиска "jose", "JOSE", "José", "JOSÉ", "JÒSE", "jöse", "JoSÈ", ... нужно вернуть известные мне 84 строки. Я могу сделать поиск нечувствительным к регистру и нечувствительным к "латыни".

Такие решения, как COLLATIONна LIKE, у меня не работают, не знаю почему...

Что мне делать?

Заранее спасибо!

РЕДАКТИРОВАТЬ:

Если я делаю что-то вроде:

WHERE p.NAME LIKE '%jose%' COLLATE utf8_general_ci;

я получаю сообщение об ошибке:

COLLATION 'utf8_general_ci' is not valid for CHARACTER SET 'latin1'

И я также изменил все возможные сопоставления для столбцов!

И если я сделаю что-то вроде:

WHERE p.NAME LIKE _utf8 '%jose%' COLLATE utf8_general_ci;

Сообщается о тех же 83 строках, как будто я ничего не сделал...

20
задан eggyal 31 May 2012 в 10:01
поделиться