我正在尝试编写一个 MySQL 查询来识别实际包含首字母的名字字段。问题是查询正在拾取不应该匹配的记录。
我已经针对 RegEx Buddy 中的 POSIX ERE 正则表达式实现进行了测试,以确认我的正则表达式字符串是正确的,但是在 MySQL 查询中运行时,结果会有所不同。
例如,查询应识别字符串,例如:
“AJD”或“AJ D”。
但它也匹配诸如“Ralph”或“Terrance”之类的字符串。
查询:
SELECT *, firstname REGEXP '^[a-zA-z]{1}(([[:space:]]|\.)+[a-zA-z]{1})+([[:space:]]|\.)?$' FROM test_table
如果相关的话,这里的“名字”字段是 VARCHAR 255。
使用字符串文字而不是表数据运行时,我得到相同的结果:
SELECT 'Ralph' REGEXP '^[a-zA-z]{1}(([[:space:]]|\.)+[a-zA-z]{1})+([[:space:]]|\.)?$'
MySQL 文档警告 REGEXP 的潜在问题,我不确定这是否与我看到的问题有关:
警告 REGEXP 和 RLIKE 运算符以字节方式工作,因此它们不是多字节安全的,并且可能会产生多字节字符集的意外结果。此外,这些运算符通过字节值比较字符,即使给定的排序规则将它们视为相等,重音字符也可能不会比较相等。
提前致谢。