【发布时间】:2010-02-04 12:13:56
【问题描述】:
我发现 mysql 的行为非常奇怪。 下面的选择返回0:
SELECT CONVERT('a' USING BINARY) REGEXP '[\x61]'
但是,下面的语义相同的选择返回 1:
SELECT CONVERT('a' USING BINARY) REGEXP '[\x61-\x61]'
你知道这里发生了什么吗? 我已经在 mysql 5.0.0.3031 和 4.1.22 中测试过
当二进制字符串以 utf8 编码时,我需要十六进制字符来创建匹配的正则表达式。这种正则表达式的 perl 版本可以在 w3c site 上找到。如下所示:
$field =~
m/\A(
[\x09\x0A\x0D\x20-\x7E] # ASCII
| [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte
| \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs
| [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte
| \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates
| \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3
| [\xF1-\xF3][\x80-\xBF]{3} # planes 4-15
| \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16
)*\z/x;
【问题讨论】:
-
我删除了
utf-8标签,因为这个问题纯粹是关于 MySQL 的正则表达式风格。您的另一个问题是处理 UTF-8 方面的问题:stackoverflow.com/questions/2199825/…