Можно ли ЗАМЕНИТЬ() сделать акцент нечувствительным (é = e)?

У меня есть таблица, в которой используется сортировка UTF-8- default.

У меня есть столбец в этой таблице с именем company, который имеет это значение Café Rouge

Когда я делаю запрос вроде:

 select * from company where name ='Cafe Rouge'

он перечисляет эту компанию, потому что обрабатывает символ é =e, но когда я использую команду replace, он не рассматривает é как e.

Итак,

select replace('Café Rouge','e','z')  

дает мне 'Café Rougz' то есть он не заменяет é на z.

Любые предложения будут заметны

Ответ 1

Я думаю, что среди хороших вещей, которые вы можете сделать, это поддерживать второй столбец, который сохраняет эти строки в нормальной форме; например, этот столбец будет содержать "Cafe Rouge", а не "Café Rouge". Вы можете проецировать исключительные символы в свой запрос, а затем использовать стандартный столбец формы для запроса.

Ответ 2

Try

SELECT REPLACE(CONVERT(name USING ascii), 'e', 'z')

чтобы преобразовать столбец name в ASCII перед выполнением замены.

Ответ 3

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

Ответ 4

Почему вы не выполняете выбор в кафе-руфе и не заменяете нужный столбец на каждый возвращаемый результат?

Ответ 5

Вам нужно будет сделать это за пределами mySQL.

Вы можете нормализовать строку внутри mySQL, как показано @Christian, используя CONVERT(), но это приведет к уничтожению любых других символов, отличных от ASCII:

Bürgercafé Römer 

закончится

Burgercafz Romer

символы из других наборов символов, таких как кириллица или китайский, будут полностью удалены.

Лучше всего либо заменить все символы, которые вы хотите заменить.

replace('Café Rouge','e','z')  
replace('Café Rouge','é','z')  
replace('Café Rouge','è','z')  

Чтобы сделать то, что вы хотите, вам нужно будет загрузить каждую строку на язык программирования, например PHP.

Там вы можете сделать следующее:

  • Загрузите строку из базы данных; убедитесь, что UTF-8

  • Разделите строку на свои символы (помните о многобайтовых символах - используйте mb_split())

  • Пройдите через каждый символ

  • Нормализовать символ, используя iconv($character, "UTF-8", "ASCII//TRANSLIT");

  • Если нормализованный символ приводит к e, вы знаете, что вам нужно будет заменить его в своей строке.

  • Запишите измененную строку обратно в базу данных.

Это, однако, похоже на ужасную проблему, которая кажется маленькой. Вы действительно уверены, что это необходимо?