MySQL REGEXP 未产生预期结果(多字节不安全?)。有解决办法吗?

标签 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

此处的“名字”字段是 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/

相关文章:

c# - 将数据库连接到 .net 核心 MVC 项目

mysql - 在 Mac 上为 Ruby on Rails 设置本地 Web 服务器

regex - Perl 单词拆元音 : removing all vowels except the first and last

javascript - 匹配 css 类并使用 jquery 和 regex 删除

javascript - 正则表达式 : match known number

mysql - 错误: cannot add foreign key constraint

mysql - 我如何在子查询中分组或如何实现我的输出

php - 尝试从 Google App Engine 连接到外部数据库服务器时出错

java - 如何替换两个数字之间的每个空格?

java - 使用正则表达式查找超过 1 个字符串