MySQL REGEXP没有产生预期的结果(不是多字节安全?)。有工作吗?

时间:2013-02-19 11:22:42

标签: mysql regex

我正在尝试编写MySQL查询以识别实际包含首字母的名字字段。问题是查询正在拾取不匹配的记录。

我已经针对RegEx Buddy中的POSIX ERE正则表达式实现进行了测试,以确认我的正则表达式字符串是正确的,但是当在MySQL查询中运行时,结果会有所不同。

例如,查询应标识字符串,例如:

'A.J.D'或'A J D'。

但它也匹配像'Ralph'或'Terrance'这样的字符串。

查询:

SELECT *, firstname REGEXP '^[a-zA-z]{1}(([[:space:]]|\.)+[a-zA-z]{1})+([[:space:]]|\.)?$' FROM test_table

如果相关,那么'firstname'字段为VARCHAR 255。

使用字符串文字而不是表数据运行时得到相同的结果:

SELECT 'Ralph' REGEXP '^[a-zA-z]{1}(([[:space:]]|\.)+[a-zA-z]{1})+([[:space:]]|\.)?$' 

MySQL文档警告REGEXP的潜在问题,我不确定这是否与我所看到的问题有关:

  

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

提前致谢。

1 个答案:

答案 0 :(得分:1)

如果你在mysql客户端中测试它,你需要转义反斜杠。每次出现\.都必须变为\\.这是必要的,因为您的输入首先由mysql客户端处理,后者将\.变为.。所以你需要通过逃避它来保持反斜杠。