MySQL:小写或大写正则表达式是否安全?

时间:2013-05-17 07:22:09

标签: mysql regex case-sensitive case-insensitive

我在MySQL中使用多字节编码(utf-8)数据中的正则表达式,但我需要它不区分大小写。由于MySQL有错误(多年未解决)它无法正确处理匹配的多字节编码字符串不区分大小写,我试图通过降低值和正则表达式模式来模拟“不敏感”。以这种方式小写regexp模式是否安全?我的意思是,有没有遗忘的边缘案例?

跟随会导致任何问题吗?

LOWER('šárKA') = REGEXP LOWER('^Šárka$')

更新:我编辑的问题更具体。

MySQL documentation

  

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

到目前为止their bug filed in 2007尚未解决。但是,我不能只是改变数据库来解决这个问题。我需要以某种方式将MySQL视为'Š'等于'š',即使它是通过用不那么优雅的解决方案来破解它。除了重音(多字节)之外的其他字符匹配良好且没有问题。

2 个答案:

答案 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或类似的东西。必须对其进行解析,并且必须仔细更改案例。