音标不敏感的mysql搜索?

3

如何使音标不敏感?

例如,这个带有波斯语音标的字符串

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

在MySQL中与去除音标后的字符串不同

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

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

5个回答

3

这有点像大小写不敏感的问题。

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

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

不确定如何在SQL中删除变音符号,也许有人可以帮忙吗? - Artelius
实际上,这比大小写敏感或不敏感更为复杂。除非软件包括对特定脚本的支持(MySQL似乎没有波斯语的支持),否则你就会失去运气。或者你需要编写自定义函数来完成它,无论哪种方式都不太美观。 - Joey
它在MySQL和希伯来语中都有效:(SELECT * FROM dictionary WHERE upper(nekudot)="כדי";) 可以找到 כְּדֵי。谢谢! - xerostomus

2
我正在使用utf8(utf8_general_ci),但是搜索没有带分音符的阿拉伯语不起作用,它并不是不敏感,或者说虽然不敏感但无法正常工作。
我尝试使用十六进制查看带或不带分音符的字符,看起来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.'%'

十六进制格式化的值是我们想要过滤掉的变音符号。虽然不太美观,但我没有找到其他答案。


0
我想到的最简洁的解决方案是:
SELECT arabic_word 
FROM Word
WHERE ( arabic_word REGEXP '{$search}' OR SOUNDEX( arabic_word ) = SOUNDEX( '{$search}' ) );

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


1
这样做会更好: SET NAMES utf8; SELECT arabic_word FROM Word WHERE arabic_word LIKE '{$search}';我习惯使用REGEXP,但在这种情况下,LIKE是关键。 必读:https://dev59.com/aHA75IYBdhLWcg3wboYz - Marcos

0

设置

set names 'utf8'

在进行拉丁语查询之前,通常可以解决问题。我不确定这是否也适用于阿拉伯语。


0

你是否已经阅读完MySQL字符集支持,以检查你的问题是否已经在其中得到解答?特别是需要理解排序规则。

我猜测使用utf8_general_ci可能对你有帮助。


http://dev.mysql.com/doc/refman/5.0/en/charset-unicode-sets.html底部有一条评论,针对希伯来语的类似问题进行了说明,指出MySQL存在问题,无论使用哪种排序规则,尽管问题不同。波斯语的问题可能是相似的。 - Joey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接