我试图在表客户中查找名称不包含字母的任何记录。以下是我正在使用的内容。运行时,它不会返回任何找到的记录。有人能指出我的错误吗?
table customers {
name = Еarnings on thе Intеrnet from
}
SELECT name from customers WHERE name NOT REGEXP '[a-zA-Z]' ;
如果我使用REGEXP '[a-zA-Z]'
比较一个字符串,如果字符串中的任何字符与该正则表达式中的一个字母匹配,它就会匹配。显示的字符串确实包含a、r、n、i、g、s等字母。其中任何一个都足以满足REGEXP比较。
mysql> select 'Еarnings on thе Intеrnet from' REGEXP '[a-zA-Z]' as ok;
+----+
| ok |
+----+
| 1 |
+----+
1 row in set (0.00 sec)
否定NOT REGEXP
与NOT (expr REGEXP pattern)
相同。它只是将结果1反转为0,或将结果0反转为1。
mysql> select 'Еarnings on thе Intеrnet from' NOT REGEXP '[a-zA-Z]' as ok;
+----+
| ok |
+----+
| 0 |
+----+
您说过要匹配不包含字母的名称。我想你的意思是,你想匹配包含任何非字母字符的名称,这是一个不同的测试。
mysql> select 'Еarnings on thе Intеrnet from' REGEXP '[^a-zA-Z]' as ok;
+----+
| ok |
+----+
| 1 |
+----+
字符Í•µ不在[a-zA-Z]
范围内,表示字符互补范围的方法是使用[^a-zA-Z]
。也就是说,如果^
字符位于方括号内,则如果该字符不是该范围内的字符之一,则该字符将匹配。
另请参阅https://dev.mysql.com/doc/refman/8.0/en/regexp.html#regexp-项下的语法:
- [a-dX],[^a-dX]
回复您的评论:
我测试了一下你提到的字符,包括空格、撇号、点和破折号:
mysql> select 'Mr. Tim O''Toole' regexp '[^a-zA-Z '.-]' as ok;
+----+
| ok |
+----+
| 0 |
+----+
mysql> select 'Mr. Tim $ O''Toole' regexp '[^a-zA-Z '.-]' as ok;
+----+
| ok |
+----+
| 1 |
+----+
您不需要在-
之前放一个反斜杠,但它确实需要特殊处理:
若要包含文字字符,必须先写或写最后一个。
这在我链接到的文档中。