【问题标题】:Does MySQL Regexp support Unicode matchingMySQL Regexp 是否支持 Unicode 匹配
【发布时间】:2013-01-16 10:28:42
【问题描述】:
有谁知道Mysql的正则表达式是否支持unicode?我一直在做一些研究,大多数博客等似乎表明存在问题或不受支持。我想知道最好将 LIKE 用于 unicode 模式匹配,将 regexp 用于 ASCII 增强模式匹配?
我喜欢能够在字符串的开头或结尾搜索匹配的想法,但是如果 regexp 不支持 unicode,那么如果我的文本是 unicode,这可能会很困难。
【问题讨论】:
标签:
mysql
regex
unicode
pattern-matching
【解决方案1】:
-
有谁知道Mysql的正则表达式是否支持unicode?我一直在做一些研究,大多数博客等似乎都表明存在问题或不受支持。
如Regular Expressions 中所述:
警告
REGEXP 和 RLIKE 运算符以字节方式工作,因此它们不是多字节安全的,并且可能会在使用多字节字符集时产生意外结果。此外,这些运算符通过字节值比较字符,即使给定的排序规则将重音字符视为相等,重音字符也可能不相等。
-
我想知道是否最好使用 LIKE 进行 unicode 模式匹配和 regexp 进行 ASCII 增强模式匹配?
是的,这样最好。
-
我喜欢能够在字符串的开头或结尾搜索匹配项的想法,但如果 regexp 不支持 unicode,那么如果我的文本是 unicode,这可能会很困难。
LIKE 也可以做到这一点:
WHERE foo LIKE 'bar%'
还有:
WHERE foo LIKE '%bar'
【解决方案2】:
MariaDB starting with 10.0.5:
REGEXP/RLIKE 和新函数 REGEXP_REPLACE()、REGEXP_INSTR() 和 REGEXP_SUBSTR() 现在可以与所有
MariaDB 支持的多字节字符集,包括东亚
字符集(big5、gb2313、gbk、eucjp、eucjpms、cp932、ujis、
euckr) 和 Unicode 字符集 (utf8, utf8mb4, ucs2, utf16,
utf16le、utf32)。在早期版本的 MariaDB(以及所有 MySQL
版本)REGEXP/RLIKE 仅适用于 8 位字符集。