变音符号不敏感的mysql搜索?

时间:2009-10-18 10:32:36

标签: php sql mysql diacritics

如何使变音符号不敏感,

这个带有变音符号的波斯语字符串

هواىبرآفتاببارز

与mySql

中删除的变音符号不同

هواىبرآفتاببارز

有没有办法告诉mysql忽略变音符号,还是我必须手动删除字段中的所有变音符号?

5 个答案:

答案 0 :(得分:2)

我正在使用utf8(utf8_general_ci)并且在没有变音符号的情况下搜索阿拉伯语不起作用,它不是不敏感的,或者它是但不能正常工作。

我尝试使用Hex查看带有和没有变音符号的字符,它看起来像mysql,认为它是两个不同的字符。

我正在考虑使用十六进制和替换(大量替换)来过滤变音符时搜索单词。

我的解决方案是对阿拉伯语单词进行不敏感搜索:

SELECT arabic_word FROM Word
WHERE
REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(HEX(REPLACE(
arabic_word, "-", "")), "D98E", ""), "D98B", ""), "D98F", ""), "D98C", 
""),"D991",""),"D992",""),"D990",""),"D98D","") LIKE ?', '%'.$search.'%'

以十六进制格式化的值是我们要过滤的变音符号。 丑陋,但我没有找到另一个anwser。

答案 1 :(得分:1)

这有点像不区分大小写的问题。

SELECT * FROM blah WHERE UPPER(foo) = "THOMAS"

在比较之前,只需将两个字符串转换为无变音符号。

答案 2 :(得分:0)

您是否已经阅读了所有MySQL Character Set Support来检查您的问题的答案是否已经存在?特别是整理是理解的。

我猜测使用utf8_general_ci可以为你做正确的事

答案 3 :(得分:0)

设置

set names 'utf8'
在进行查询之前,

通常会执行拉丁查找的技巧。我不确定这是否适用于阿拉伯语。

答案 4 :(得分:0)

我遇到的最干净的解决方案是:

SELECT arabic_word 
FROM Word
WHERE ( arabic_word REGEXP '{$search}' OR SOUNDEX( arabic_word ) = SOUNDEX( '{$search}' ) );

我没有检查过SOUNDEX功能的成本。我想这可能适用于小型表,但不适用于大型数据集。