SELECT * FROM t WHERE c REGEXP '.*\(..\).*';
这没有用。它返回了许多行,其c
包含的字符串在()
.
SELECT * FROM t WHERE c LIKE '%(__)%'
SQL小提琴在这里
你的逃生通道已经关闭。
http://dev.mysql.com/doc/refman/5.0/en/regexp.html#operator_regexp
因为 MySQL 在字符串中使用 C 转义语法(例如,“\n”来表示换行符),所以您必须将您在 REGEXP 字符串中使用的任何“\”加倍。
采用:
SELECT * FROM t WHERE c REGEXP '.*\\(..\\).*';
你是如何运行这个查询的?如果您在(比如说)PHP 脚本中使用它,并像这样编写它:
$sql = "SELECT ... REGEXP '.*\(..\).*';";
那么 PHP 解释器实际上会去掉那些反斜杠,产生真正的查询
... REGEXP '.*(..).*';
这将只是具有至少两个字符的任何记录。为了使其正常工作,您必须双重转义:
$sql = "SELECT ... REGEXP '.*\\(..\\).*';";
PHP 将从每组中删除一个反斜杠,让第二个实际到达 mysql。