我在MySQL中使用多字节编码(utf-8)数据中的正则表达式,但我需要它不区分大小写。由于MySQL有错误(多年未解决)它无法正确处理匹配的多字节编码字符串不区分大小写,我试图通过降低值和正则表达式模式来模拟“不敏感”。以这种方式小写regexp模式是否安全?我的意思是,有没有遗忘的边缘案例?
跟随会导致任何问题吗?
LOWER('šárKA') = REGEXP LOWER('^Šárka$')
更新:我编辑的问题更具体。
REGEXP和RLIKE运算符以字节方式工作,因此它们不是多字节安全的,并且可能会产生多字节字符集的意外结果。此外,这些运算符通过字节值比较字符,即使给定的排序规则将它们视为相等,重音字符也可能无法比较。
到目前为止their bug filed in 2007尚未解决。但是,我不能只是改变数据库来解决这个问题。我需要以某种方式将MySQL视为'Š'等于'š',即使它是通过用不那么优雅的解决方案来破解它。除了重音(多字节)之外的其他字符匹配良好且没有问题。
答案 0 :(得分:3)
正则表达式的i
选项将确保它不区分大小写。
示例:
'^(?i)Foo$' // (?i) will turn on case insensitivity for the rest of the regex
'/^Foo$/i' // the i options turns off case sensitivity
请注意,这些可能不适用于您特定的正则表达式(您尚未暗示过),因此请务必参阅手册以了解正确的语法。
更新
从这里开始:http://dev.mysql.com/doc/refman/5.1/en/regexp.html
REGEXP不区分大小写,除非与二进制字符串一起使用。
答案 1 :(得分:0)
由于没有人真正回答我原来的问题,我做了自己的研究并意识到小写或大写正则表达式是不安全的,没有任何其他处理。确切地说,使用理论上纯正的正则表达式来做这件事是安全的,但是他们的每个理智的实现都会添加一些字符类和特殊指令,这些指令很容易发生更改:
\n
,\t
等\W
(非字母数字)和\w
(字母数字)。[.characters.]
,[=character_class=]
或[:character_class:]
(MySQL正则表达式方言)。小写或大写\W
和\w
可能会完全改变正则表达式的含义。这导致以下结论:
LOWER
或类似的东西。必须对其进行解析,并且必须仔细更改案例。