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

时间:2016-03-03 23:48:00

标签: mysql regex sql-like rlike

我需要实现一个小搜索引擎。问题是,数据库中有数据使用而不是像äöü字母那样的字母。我需要有可能找到它们。我可以使用我的正则表达式生成器函数轻松完成此任务:

 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é”,但在那里使用正则表达式是不可能的。

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

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

有没有人有线索?

1 个答案:

答案 0 :(得分:1)

好的,我自己找到了答案。这可能不是最好的做法。但我工作正常。所以,如果你有几个字符可以写成,就像在我的情况下,德语“ö”作为“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));

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