【问题标题】:REGEXP not working as expected, inside a PHP script在 PHP 脚本中,REGEXP 未按预期工作
【发布时间】:2016-09-07 00:11:52
【问题描述】:

在 PHP 中查询数据库时,我遇到了 mysql 的这个问题。

PHP代码是:

$Query = "SELECT COUNT(*) FROM theTable WHERE fieldValue REGEXP 'Dom-R[eéèêë]my'";
$DBR = mysql_query($Query,$Connection);

我希望这个查询得到类似的东西,我的意思是找到那些的数量:

Dom-Remy
Dom-Rémy
Dom-Rèmy
...etc...

但我什么也没得到,我的意思是零。代码有什么问题?我尝试了几种变体,都同样不起作用。

【问题讨论】:

标签: php mysql regex


【解决方案1】:

这是 Unicode 字符的主题。

发生的情况是,您的示例中的 e,é,è,ê,ë.. 不是单个字母而是 2,因为波浪号也算作一个字符。这带来了许多复杂性和需要遵循的规则才能满足 Unicode 规则。

您可以执行以下操作:([\x{0049}-\x{0130}]) 来搜索带有波浪号的字母,但此表达式可能会有所不同,具体取决于您是否要在 .net、java、javascript 或 php 上使用此表达式。

您也可以在这里查看每个字符代表的代码:

http://www.fileformat.info/info/unicode/char/search.htm?q=%C4%B0&preview=entity

【讨论】:

  • 我已经尝试按照您的建议进行操作,但这很棘手,必须有更好的方法。
【解决方案2】:

根据官方website 规范,MySQL 正则表达式以字节方式匹配

REGEXP 和 RLIKE 运算符通过字符来比较字符 字节值和重音字符可能不相等,即使 给定的排序规则将它们视为平等。

如果你可以匹配任何字符来代替[eéèêë],这就足够了:

$Query = "SELECT COUNT(*) FROM theTable WHERE field REGEXP '^Dom-R.+?my$'";

【讨论】:

  • 不,这当然不能匹配任何字符。否则我不会用特定的欧洲字符敲我的头。
【解决方案3】:

如果

  • 列的CHARACTER SETutf8utf8mb4
  • 客户端和 mysql 服务器之间的连接也是这些字符集,
  • 你没有使用COLLATION utf8_bin那么

'Dom-Remy' = 'Dom-Rémy' = ...

WHERE ... = ...WHERE ... LIKE ... 将遵守上述规定。 REGEXP (RLIKE) 不能使用,原因已经讨论过了。

This 显示相等(=LIKE。)

如果您只是在字符串中搜索Dom-Remy,请使用

fieldValue LIKE '%Dom-Remy%`

而不是 regexp/rlike

如果您有更复杂的问题需要REGEXP,那么请使用详细信息开始一个新问题。

【讨论】:

    猜你喜欢
    • 2011-05-17
    • 2016-09-07
    • 1970-01-01
    • 2015-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多