0

我正在尝试编写一个 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 运算符以字节方式工作,因此它们不是多字节安全的,并且可能会产生多字节字符集的意外结果。此外,这些运算符通过字节值比较字符,即使给定的排序规则将它们视为相等,重音字符也可能不会比较相等。

提前致谢。

4

1 回答 1

1

如果您在 mysql 客户端中对此进行测试,则需要转义反斜杠。每次出现\.must 变成\\.这是必要的,因为您的输入首先由 mysql 客户端处理,然后\.变成.. 所以你需要通过转义它们来保持反斜杠。

于 2013-02-19T11:32:41.730 回答