如何使用RegExp在MySQL中创建阿拉伯字符类?

时间:2016-07-17 19:19:47

标签: mysql regex arabic

例如,我想创建一个类字符,ara数字[٩-٠] ..内容所有数字。
相应的Unicode是[U+0660-U+0669],我试过这个:

Select * FROM employees WHERE ID REGEXP [\u{0660}-\u{0669}];

我收到此错误

  

#1064 - 您的SQL语法出错;检查与您的MySQL服务器版本相对应的手册,以便使用接近' [\ u {0660} - \ u {0669}] LIMIT 0,25'在第1行"

1 个答案:

答案 0 :(得分:2)

https://dev.mysql.com/doc/refman/5.7/en/regexp.html

  

警告

     

REGEXP和RLIKE运算符以字节方式工作,因此它们是   不是多字节安全的,可能会产生多字节的意外结果   字符集。另外,这些运算符比较字符   它们的字节值和重音字符可能无法相等   即使给定的校对将它们视为平等。

也就是说,如果在正则表达式中使用Ã,它会将2字节的utf8代码视为2个字节(十六进制)C383。如果这给你“正确”答案,那么它将更多地是“运气”而不是设计。

这确实有效:

mysql> SELECT '١' REGEXP '[٩-٠]';
+-----------------------+
| '١' REGEXP '[٩-٠]'    |
+-----------------------+
|                     1 |
+-----------------------+

但是,这只是巧合。正则表达式类似于[x0-x9],其中x是D9字节,0是A0,9是A9。但是,正则表达式是“任何字符x,或0x之间,或9,这不是您想要的。

这个可能适用于所有阿拉伯语:REGEXP UNHEX('5BD82DDD5D'),但仅仅因为'all'以十六进制D8到DD开头。 (但是,该范围内可能还有其他内容。)此外,这只会检查“字符串是否包含阿拉伯字母;它不能用于任何更复杂的内容,例如短语或字母子集。

返回数字范围。只检查十六进制D9是不安全的,因为这将包括百分号,上标字母和其他字符。 可以工作:REGEXP UNHEX('D95BA02DA95D')

警告:我在这个答案中所说的大部分内容都未经过测试;我正在一个我没有经验的领域(使用utf8的REGEXP)发明一个解决方案。