我如何使变音符号不敏感,
例如这个带有变音符号的波斯语字符串
هواى بَر آفتابِ بارِز
与 mySql 中删除的变音符号不同
هواى بر آفتاب بارز
有没有办法告诉 mysql 忽略变音符号,或者我必须手动删除字段中的所有变音符号?
我如何使变音符号不敏感,
例如这个带有变音符号的波斯语字符串
هواى بَر آفتابِ بارِز
与 mySql 中删除的变音符号不同
هواى بر آفتاب بارز
有没有办法告诉 mysql 忽略变音符号,或者我必须手动删除字段中的所有变音符号?
这有点像不区分大小写的问题。
SELECT * FROM blah WHERE UPPER(foo) = "THOMAS"
只需在比较之前将两个字符串都转换为无变音符号。
我正在使用 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.'%'
十六进制格式的值是我们要过滤的变音符号。丑陋,但我没有找到另一个答案。
您是否已经阅读了所有MySQL 字符集支持以检查您的问题的答案是否已经存在?尤其要理解排序规则。
我猜想使用 utf8_general_ci 可以为你做正确的事
环境
set names 'utf8'
在进行查询之前,通常可以进行拉丁语查找。我不确定这是否也适用于阿拉伯语。
我找到的最干净的解决方案是:
SELECT arabic_word
FROM Word
WHERE ( arabic_word REGEXP '{$search}' OR SOUNDEX( arabic_word ) = SOUNDEX( '{$search}' ) );
我还没有检查 SOUNDEX 功能的成本。我想这可能适用于小表,但不适用于大型数据集。