在mysql中匹配的regexp中的十六进制字符

Pio*_*pla 7 regex mysql

我发现了很奇怪的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)

Mar*_*ers 4

这也匹配:

SELECT CONVERT('a' USING BINARY) REGEXP '[1-\x]'
Run Code Online (Sandbox Code Playgroud)

原因是和之间\x被解释为和。正则表达式的其余部分只是普通字符,与此处无关,因为它们已经在 [1-x] 范围内。xa1x

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)