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