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

时间:2010-02-04 12:13:57

标签: mysql regex

我发现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中编码二进制字符串时匹配的正则表达式。可以在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;

4 个答案:

答案 0 :(得分:4)

在mysql中写一个像CREATE TYPE [dbo].[CoordinateListWithRefId] AS TABLE( [RefID] [int] NOT NULL, [Latitude] [float] NOT NULL, [Longitude] [float] NOT NULL ) 这样的正则表达式,你可以在concat中使用十六进制值:

[\x61-\x65]

答案 1 :(得分:3)

这也匹配:

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

原因是\xxa之间的1x之间是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. 。你的正则表达式的其余部分只是普通字符,因为它们已经在[1-x]范围内,所以它们在这里是不相关的。

SELECT HEX('a')
61

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

{{1}}

答案 2 :(得分:2)

大声笑...基于以上所述,您只需使用打印字符即可。这对我有用。我想让它匹配不在美国键盘上的字符,下面的表达式适用于MySQL 5.1:

[^ -~]

这将与

做同样的事情
[^\x20-\x7E]

答案 3 :(得分:0)

我想在latin-1列中检查UTF-8编码的字符,以Puggan Se给我的答案扩展:

mysql> SELECT count(*) from myTable where CONVERT(myCol  USING BINARY) REGEXP CONCAT('[',0xF0,'-',0xFF,']','[', 0x80, '-', 0xBF, ']') limit 3;
+----------+
| count(*) |
+----------+
|        0 |
+----------+
1 row in set (0.54 sec)

mysql> SELECT count(*) from myTable where CONVERT(myCol  USING BINARY) REGEXP CONCAT('[',0xE0,'-',0xEF,']','[', 0x80, '-', 0xBF, ']') limit 3;
+----------+
| count(*) |
+----------+
|        0 |
+----------+
1 row in set (0.53 sec)

mysql> SELECT count(*) from myTable where CONVERT(myCol  USING BINARY) REGEXP CONCAT('[',0xC2,'-',0xDF,']','[', 0x80, '-', 0xBF, ']') limit 3;
+----------+
| count(*) |
+----------+
|        0 |
+----------+
1 row in set (0.50 sec)

mysql> 

当我不计算行数时,存在极限,将正则表达式中的最后一个范围取反显示我实际上在那里有扩展字符(使我确信,正则表达式有效,因为它未找到任何损坏的数据我呢)。 参考:https://www.fileformat.info/info/unicode/utf8.htm