字符 class 不适用于阿拉伯文本列

Character class is not working for Arabic text column

根据定义 MySQL 字符 class [...] 匹配括号内的任何字符。所以我将它用于阿拉伯字符。它每次都给我空集。 这是我的查询:

select hadith_raw_ar from view_hadith_in_book where hadith_raw_ar like '%[بل]ت';

Be definition mySQL character class [...] matches any character within the brackets.

嗯,那不准确。字符 class 实际上是正则表达式的一部分, 而不是 MySQL。但是,您仍然可以使用带 MySQL 的正则表达式,当然,您需要使用关键字 REGEXP 而不是 LIKE.

现在,如果您尝试匹配以您的角色 class 中代表的任何字符开头的任何内容,您应该使用类似于 ^[...] 的正则表达式模式,您可以在其中替换... 加上你想要的字符。

所以,在你的情况下,你需要这样的东西:

SELECT hadith_raw_ar FROM view_hadith_in_book WHERE hadith_raw_ar REGEXP '^[تبل]';

相当于:

SELECT  hadith_raw_ar 
FROM    view_hadith_in_book 
WHERE   hadith_raw_ar LIKE 'ت%' OR 
        hadith_raw_ar LIKE 'ب%' OR
        hadith_raw_ar LIKE 'ل%';

..当不使用正则表达式时。


参考文献:

使用utf8_general_ci集合插入任何语言字符

对于旧版本,您不能将字符 classes 与 LIKE 或 RLIKE 和非 latin1 字符集一起使用。 (至少不会,并期望得到正确的结果。)

REGEXP 很蹩脚。它只看字节;您的字符 class 中的 6 个字节,其中一些是重复的。这是十六进制:D8 AA D8 A8 D9 84.

有时你会碰巧REGEXP得到'right'答案。 MariaDB 有一个不错的 REGEXP。例如,SELECT '٪' REGEXP '[تبل]'; returns 为真。请注意,我正在测试阿拉伯百分号 - 十六进制 D9AA。请注意我是如何选择 D9 的,它存在于一些阿拉伯字符和 AA 中。

MySQL 8.0 手册暗示 REGEXP 可能适用于阿拉伯语。 (但不适用于 Emoji 和一些汉字。)MariaDB 从 10.0.5 开始就内置了 PCRE。