我发现了很奇怪的mysql行为.下面的选择返回0:
SELECT CONVERT('a' USING BINARY) REGEXP '[\x61]'
Run Code Online (Sandbox Code Playgroud)
但是在语义上相同的select下面返回1:
SELECT CONVERT('a' USING BINARY) REGEXP '[\x61-\x61]'
Run Code Online (Sandbox Code Playgroud)
你知道这里发生了什么吗?我在mysql 5.0.0.3031和4.1.22中测试过
我需要十六进制字符来创建一个在utf8中编码二进制字符串时匹配的正则表达式.可以在w3c站点上找到这种正则表达式的perl版本.它看起来如下:
$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;
Run Code Online (Sandbox Code Playgroud)
这也匹配:
SELECT CONVERT('a' USING BINARY) REGEXP '[1-\x]'
Run Code Online (Sandbox Code Playgroud)
原因是和之间\x
被解释为和。正则表达式的其余部分只是普通字符,与此处无关,因为它们已经在 [1-x] 范围内。x
a
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.
Run Code Online (Sandbox Code Playgroud)
我不确定你想要实现什么,但如果你想要十六进制字符,你可以使用 hex 函数:
SELECT HEX('a')
61
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3274 次 |
最近记录: |