我正在尝试编写一个 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
此处的“名字”字段是 VARCHAR 255(如果相关)。
当使用字符串文字而不是表数据运行时,我得到相同的结果:
SELECT 'Ralph' REGEXP '^[a-zA-z]{1}(([[:space:]]|\.)+[a-zA-z]{1})+([[:space:]]|\.)?$'
MySQL 文档警告有关 REGEXP 的潜在问题,我不确定这是否与我遇到的问题有关:
Warning The REGEXP and RLIKE operators work in byte-wise fashion, so they are not multi-byte safe and may produce unexpected results with multi-byte character sets. In addition, these operators compare characters by their byte values and accented characters may not compare as equal even if a given collation treats them as equal.
提前致谢。
最佳答案
如果您在 mysql 客户端中对此进行测试,则需要转义反斜杠。每次出现 \.
都必须变成 \\.
这是必要的,因为您的输入首先由 mysql 客户端处理,它会变成 \.
进入 .
。因此,您需要通过转义反斜杠来保留它们。
关于MySQL REGEXP 未产生预期结果(多字节不安全?)。有解决办法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14956234/