我发现 mysql 的行为非常奇怪。
下面的选择返回 0:
SELECT CONVERT('a' USING BINARY) REGEXP '[\x61]'
然而,下面语义相同的 select 返回 1:
SELECT CONVERT('a' USING BINARY) REGEXP '[\x61-\x61]'
你知道这里发生了什么吗?
我已经在 mysql 5.0.0.3031 和 4.1.22 中测试过
我需要十六进制字符来创建一个在二进制字符串以 utf8 编码时匹配的正则表达式。可以在以下位置找到此类正则表达式的 Perl 版本w3c site http://www.w3.org/International/questions/qa-forms-utf-8.en.php。它看起来如下:
$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;
这也匹配:
SELECT CONVERT('a' USING BINARY) REGEXP '[1-\x]'
原因是\x
被解释为x
and a
介于1
and x
。正则表达式的其余部分只是普通字符,与此处无关,因为它们已经在 [1-x] 范围内。
SELECT CONVERT('0' USING BINARY) REGEXP '[\x61-\x61]' -- Fails, because 0 < 1.
SELECT CONVERT('1' USING BINARY) REGEXP '[\x61-\x61]' -- Succeeds: inside [1-x].
SELECT CONVERT('2' USING BINARY) REGEXP '[\x61-\x61]' -- Succeeds: inside [1-x].
...
SELECT CONVERT('w' USING BINARY) REGEXP '[\x61-\x61]' -- Succeeds: inside [1-x].
SELECT CONVERT('x' USING BINARY) REGEXP '[\x61-\x61]' -- Succeeds: inside [1-x].
SELECT CONVERT('y' USING BINARY) REGEXP '[\x61-\x61]' -- Fails, because y > x.
我不确定你想要实现什么,但如果你想要十六进制字符,你可以使用 hex 函数:
SELECT HEX('a')
61
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)