mysql LIKE и регулярное выражение VS RLIKE и диакритические знаки

Мне нужно реализовать небольшую поисковую систему. Проблема в том, что внутри базы данных есть данные, в которых вместо букв типа ä ö ü используются буквы ae oe ue. Мне нужна возможность найти их. Я могу легко сделать это с помощью моей функции генератора регулярных выражений:

 function shittyumlauts($string){
  $string = mb_strtolower($string);
  $string = preg_replace('/(Ä|ä|ae)/i', '(ä|ae)', $string);
  $string = preg_replace('/(Ö|ö|oe)/i', '(ö|oe)', $string);
  $string = preg_replace('/(Ü|ü|ue)/i', '(ü|ue)', $string);
  return $string;
 }

Я поместил его в запрос с >RLIKE $string‹. Все идет нормально.

Но есть в базе и «Ренес». Когда я использую RLIKE, я не могу найти их, введя «Rene». С другой стороны, если я использую >LIKE $string‹, он находит «Rene» при вводе «Rene», но использование регулярного выражения здесь невозможно.

Я гуглил уже несколько часов и нашел здесь несколько похожих тем. Но реального решения пока нет.

Я подумал, что могу ВЫБРАТЬ поля и применить к ним REGEX REPLACE, например REPLACE(поле, [^a-z], '_') (недопустимый код) и использовать LIKE.

У кого-нибудь есть ключ?


person Bernhard    schedule 03.03.2016    source источник
comment
Интересное название метода.   -  person Eric J.    schedule 04.03.2016
comment
рад что понравилось 3 :)   -  person Bernhard    schedule 04.03.2016
comment
Какая у вас версия mysql?   -  person Jorge Campos    schedule 04.03.2016
comment
это 5.6.28-76.1-лог.   -  person Bernhard    schedule 04.03.2016
comment
Хорошо, у меня есть еще одна идея, которая может сработать. Я попробую это как можно скорее. Мне нужно заменить буквы äöüß на ae oe ue ss при выборе их из базы данных, и я делаю то же самое на входных данных. Тогда запрос будет сделан с LIKE. Я думаю, это должно сработать.   -  person Bernhard    schedule 04.03.2016
comment
LIKE понимает эти символы. RLIKE работает с байтами, а не с символами.   -  person Rick James    schedule 06.03.2016


Ответы (1)


Хорошо, я нашел ответ сам. Вероятно, это не лучшая практика. Но я работаю нормально. Итак, если у вас есть пара символов, которые можно было бы написать иначе, как в моем случае немецкое «ö» как «oe», вы можете построить свой запрос следующим образом:

... WHERE REPLACE(LOWER(c_name), 'ö', 'oe') COLLATE utf8_general_ci 
    LIKE '".mysqli_real_escape_string($link, $search)."' ...

тогда он найдет не только «möglich», набрав «moeglich» (и наоборот), но и «rené», выполнив поиск «rene» (и наоборот)

кроме того, вы также должны преобразовать символы в поисковом запросе:

  $string = str_replace(array('ä', 'ö', 'ü', 'ß'),
                        array('ae', 'oe', 'ue', 'ss'),
                        mb_strtolower($string));

Это оно. Я надеюсь, что это может помочь кому-то :)

person Bernhard    schedule 04.03.2016