我正在尝试编写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运算符以字节方式工作,因此 它们不是多字节安全的,可能会产生意想不到的结果 多字节字符集。另外,这些运营商比较 字节值和重音字符的字符可能不会 即使给定的校对将它们视为相等,也要比较相等。
提前致谢。
答案 0 :(得分:1)
如果你在mysql客户端中测试它,你需要转义反斜杠。每次出现\.
都必须变为\\.
这是必要的,因为您的输入首先由mysql客户端处理,后者将\.
变为.
。所以你需要通过逃避它来保持反斜杠。