为什么RLIKE在MariaDB 10.2中匹配二进制字符集中的á和è

0tdrvxhp  于 4个月前  发布在  其他
关注(0)|答案(1)|浏览(47)

DB:MariaDB 10.2.13,10.3.39.
操作符RLIKE在检查我的二进制字符串中是否存在char è时返回true:
第一个月
查询:

([email protected]:3306) [test]> select char(50081), char(50088), hex(char(50081)), hex('á'), char(50081) RLIKE '[è]', char(50088) RLIKE '[á]', convert(char(50088) using utf8) RLIKE '[á]', convert(char(50088) using utf8mb4) RLIKE '[á]', convert('á' using binary) RLIKE '[è]', 'á' RLIKE '[è]' \G
*************************** 1. row ***************************
                                    char(50081): á
                                    char(50088): è
                               hex(char(50081)): C3A1
                                      hex('á'): C3A1
                       char(50081) RLIKE '[è]': 1
                       char(50088) RLIKE '[á]': 1
   convert(char(50088) using utf8) RLIKE '[á]': 0
convert(char(50088) using utf8mb4) RLIKE '[á]': 0
        convert('á' using binary) RLIKE '[è]': 1
                              'á' RLIKE '[è]': 0
1 row in set (0,00 sec)

字符串

zpjtge22

zpjtge221#

看看'á''è'的十六进制代码,它们是'C3A1''C3A8'

select hex('á'), hex('è');

字符串
在二进制上下文中,值是逐字节比较的。

select concat(0xC3, 0xA1) RLIKE concat('[', 0xC3, 0xA8, ']');


字节'C3'包含在'C3A1'中,因此匹配成功。

相关问题