使用SQL匹配正则表达式出现大小写匹配错误的BUG?

Oceanbase版本:4.3.5

SELECT 
    'a' as test_char,
    CASE 
        WHEN 'a' REGEXP '^[A-Z]$' THEN '匹配大写'
        WHEN 'a' REGEXP '^[a-z]$' THEN '匹配小写'
        ELSE '不匹配'
    END as regex_result,
    ASCII('a') as ascii_code;
+-----------+--------------+------------+
| test_char | regex_result | ascii_code |
+-----------+--------------+------------+
| a         | 匹配大写     |         97 |
+-----------+--------------+------------+
1 row in set (0.03 sec)

这是个BUG麽? 还是我的用法不对

2 个赞

REGEXP 默认不区分大小写,可以使用COLLATE

SELECT 
    'a' as test_char,
    CASE 
        WHEN 'a' COLLATE utf8mb4_bin REGEXP '^[A-Z]$' THEN '匹配大写'
        WHEN 'a' COLLATE utf8mb4_bin REGEXP '^[a-z]$' THEN '匹配小写'
        ELSE '不匹配'
    END as regex_result,
    ASCII('a') as ascii_code;

1 个赞

@论坛小助手

根据您提供的SQL和查询结果,实际上这并不是一个BUG。在您的SQL中,'a' REGEXP '^[A-Z]$' 返回了 ‘匹配大写’,这是因为当前的正则表达式匹配不受字符集和校对规则的影响。在OceanBase数据库中,默认情况下正则表达式匹配是区分大小写的。然而,从您的查询结果来看,ASCII('a') 的结果是 97,这对应于小写字母 ‘a’。因此,按照正常的ASCII编码,'a' 应该只能匹配小写字母的范围 ‘^[a-z]$’,而不能匹配大写字母的范围 ‘^[A-Z]$’。这种行为表明可能存在某些隐式转换或配置问题,建议您检查数据库的字符集设置和校对规则,确保它们符合预期。如果确实存在字符集或校对规则的不一致,可以通过显式指定字符集来解决这个问题。

更多信息请查看:

  1. 5000 ~ 5999