Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在MySQL中,为什么非ASCII字符实际上是两个字符?_Mysql_Regex_Utf 8 - Fatal编程技术网

在MySQL中,为什么非ASCII字符实际上是两个字符?

在MySQL中,为什么非ASCII字符实际上是两个字符?,mysql,regex,utf-8,Mysql,Regex,Utf 8,我有一个MySQL数据库,默认编码设置为utf8。因此,使用非ASCII字符应该没有问题。但是通过REGEXP命令处理正则表达式似乎有点困难 我正在尝试使用通配符基于正则表达式查询记录。MySQL提供的函数对我来说已经足够了,但它们似乎有点断裂,因为我尝试过的非ASCII字符§和°不是由一个通配符匹配的,而是由两个通配符匹配的 例如,如果我搜索数据库中名为“§123”的wiki页面,则 SELECT * FROM wikipages WHERE title REGEXP '^.123$' 不会

我有一个MySQL数据库,默认编码设置为utf8。因此,使用非ASCII字符应该没有问题。但是通过REGEXP命令处理正则表达式似乎有点困难

我正在尝试使用通配符基于正则表达式查询记录。MySQL提供的函数对我来说已经足够了,但它们似乎有点断裂,因为我尝试过的非ASCII字符§和°不是由一个通配符匹配的,而是由两个通配符匹配的

例如,如果我搜索数据库中名为“§123”的wiki页面,则

SELECT * FROM wikipages WHERE title REGEXP '^.123$'
不会归还任何东西,但是

SELECT * FROM wikipages WHERE title REGEXP '^..123$'
返回所需的页面,注意附加的通配符

对于ASCII字符,只需要一个通配符。我想这与utf8中的字符编码使用了多少字节有关。然而,我发现这种行为相当丑陋,因为如果MySQL不平等对待所有字符,我就无法使用正则表达式

事实上,有没有一个很好的理由可以解释为什么它不能像怀疑的那样工作?有人知道如何解决我的问题吗

提前谢谢

警告

REGEXP和RLIKE运算符以字节方式工作,因此它们不是多字节安全的,并且可能会对多字节字符集产生意外的结果。此外,这些运算符按字节值比较字符,即使给定的排序规则将重音字符视为相等,重音字符也可能不作为相等字符进行比较

UTF-8是一个潜在的多字节字符集。基本上,尝试在regexp中对UTF-8字符进行通配符匹配有时会失败

您可以搜索自动扩展到正确字节数的特定字符,也可以使用非regexp模式匹配,例如,对于前缀/后缀搜索

警告

REGEXP和RLIKE运算符以字节方式工作,因此它们不是多字节安全的,并且可能会对多字节字符集产生意外的结果。此外,这些运算符按字节值比较字符,即使给定的排序规则将重音字符视为相等,重音字符也可能不作为相等字符进行比较

UTF-8是一个潜在的多字节字符集。基本上,尝试在regexp中对UTF-8字符进行通配符匹配有时会失败


您可以搜索自动扩展到正确字节数的特定字符,也可以使用非regexp模式匹配,例如,用于前缀/后缀搜索。

您需要指示是否出现了通配符

试一试

两个表达式的结果都是1。此外,MySQL手册对多字节字符发出警告

警告
REGEXP和RLIKE运算符以字节方式工作,因此它们不是多字节安全的,并且可能会对多字节字符集产生意外的结果。此外,这些运算符按字节值比较字符,即使给定的排序规则将重音字符视为相等,重音字符也可能不作为相等字符进行比较

您需要指出通配符的出现

试一试

两个表达式的结果都是1。此外,MySQL手册对多字节字符发出警告

警告
REGEXP和RLIKE运算符以字节方式工作,因此它们不是多字节安全的,并且可能会对多字节字符集产生意外的结果。此外,这些运算符按字节值比较字符,即使给定的排序规则将重音字符视为相等,重音字符也可能不作为相等字符进行比较

在这个简单的例子中,像“_123”这样的标题会起作用,但在更一般的例子中,你会失去REGEXP的功能。在这个简单的例子中,像“_123”这样的标题会起作用,但在更一般的例子中,你会失去REGEXP的功能。谢谢你的快速回答。我不想使用LIKE,因为我正在使用Django,它没有包装函数,这意味着我必须自己处理角色转义。但这似乎是最简单的方法。@j0ker看一看。它也是。@cbuckley我也考虑过contains,但是我需要一个包含LIKE someword%的查询,而不是LIKE%someword%,因为我必须能够准确地指定没有特殊字符的单词的外观。我帮不了你。我在Django发现了一篇关于LIKE的博文:谢谢你的快速回答。我不想使用LIKE,因为我正在使用Django,它没有包装函数,这意味着我必须自己处理角色转义。但这似乎是最简单的方法。@j0ker看一看。它也是。@cbuckley我也考虑过contains,但是我需要一个包含LIKE someword%的查询,而不是LIKE%someword%,因为我必须能够准确地指定没有特殊字符的单词的外观。我帮不了你。我发现了一篇关于L
德扬戈的艾克:那会有用的。但我认为这有点不切实际,因为“^.{0,2}123$”不仅会匹配§123之类的内容,还会匹配ab123。我希望查询只在那里输入一个字符,不多也不少,所以我想LIKE是最好的选择。那会有用的。但我认为这有点不切实际,因为“^.{0,2}123$”不仅会匹配§123之类的内容,还会匹配ab123。我希望查询只在那里输入一个字符,不多也不少,所以我想LIKE是最好的选择。
SELECT "§123" REGEXP "^.*123$" - any character 0 - n
SELECT "§123" REGEXP "^.{0,2}123$" - any character 0 - 2