gpt4 book ai didi

mysql - mysql中正则表达式匹配中的十六进制字符

转载 作者:可可西里 更新时间:2023-11-01 06:43:28 27 4
gpt4 key购买 nike

我发现 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 编码时,我需要十六进制字符来创建匹配的正则表达式。可以在 w3c site 上找到此类正则表达式的 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;

最佳答案

这也匹配:

SELECT CONVERT('a' USING BINARY) REGEXP '[1-\x]'

原因是 \x 被解释为 xa 介于 1 之间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.

我不确定你想要达到什么目的,但如果你想要十六进制字符,你可以使用十六进制函数:

SELECT HEX('a')
61

关于mysql - mysql中正则表达式匹配中的十六进制字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2199501/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com