mysql LIKE 和正则表达式 VS RLIKE 和变音符号

mysql LIKE and regex VS RLIKE and diacritics

我需要实现一个小搜索引擎。问题是,数据库中的数据使用字母 ae oe 代替 ä ö ü 等字母。我需要找到他们的可能性。我可以使用我的正则表达式生成器函数轻松地做到这一点:

 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< 将其放入查询中。到目前为止一切顺利。

但是数据库里也有"Renés"。当我使用 RLIKE 时,输入 "Rene" 找不到它们。另一方面,如果我使用 >LIKE $string<,它会在输入 "Rene" 时找到 "René",但在那里无法使用正则表达式。

我在谷歌上搜索了几个小时,在这里也发现了一些类似的主题。但到目前为止还没有真正的解决办法。

我考虑的是,我可以 SELECT 字段并在其上应用 REGEX REPLACE,如 REPLACE(field, [^a-z], '_') (无效代码)并使用 LIKE。

有人知道吗?

好的,我自己找到了答案。这可能不是最佳做法。但我工作正常。因此,如果您有几个字符可以像我的例子中的德语“ö”那样写成 "oe",您可以像这样构建查询:

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

然后它不仅会通过输入 "moeglich" 找到 "möglich"(反之亦然),还会通过搜索 "rene"(反之亦然)找到 "rené"

此外,您还必须转换搜索查询中的字符:

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

就是这样。我希望这可以帮助别人 :)