例如,我想创建一个类字符,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行"
答案 0 :(得分:2)
https://dev.mysql.com/doc/refman/5.7/en/regexp.html说
警告
REGEXP和RLIKE运算符以字节方式工作,因此它们是 不是多字节安全的,可能会产生多字节的意外结果 字符集。另外,这些运算符比较字符 它们的字节值和重音字符可能无法相等 即使给定的校对将它们视为平等。
也就是说,如果在正则表达式中使用Ã
,它会将2字节的utf8代码视为2个字节(十六进制)C3
和83
。如果这给你“正确”答案,那么它将更多地是“运气”而不是设计。
这确实有效:
mysql> SELECT '١' REGEXP '[٩-٠]';
+-----------------------+
| '١' REGEXP '[٩-٠]' |
+-----------------------+
| 1 |
+-----------------------+
但是,这只是巧合。正则表达式类似于[x0-x9]
,其中x是D9字节,0是A0,9是A9。但是,正则表达式是“任何字符x
,或0
和x
之间,或9
,这不是您想要的。
这个可能适用于所有阿拉伯语:REGEXP UNHEX('5BD82DDD5D')
,但仅仅因为'all'以十六进制D8到DD开头。 (但是,该范围内可能还有其他内容。)此外,这只会检查“字符串是否包含阿拉伯字母;它不能用于任何更复杂的内容,例如短语或字母子集。
返回数字范围。只检查十六进制D9
是不安全的,因为这将包括百分号,上标字母和其他字符。 可以工作:REGEXP UNHEX('D95BA02DA95D')
。
警告:我在这个答案中所说的大部分内容都未经过测试;我正在一个我没有经验的领域(使用utf8的REGEXP)发明一个解决方案。