首批通过分布式安全可靠测评,为关键业务系统打造
常量字符串前声明了 binary 后,会在列上加 cast,导致无法抽取 query range
更新时间:2026-05-15 09:06
问题现象
SQL 中,常量字符串前加上 binary 操作符之后,会在列上加 cast,导致无法抽取 query range。
关键诊断信息
触发条件
字符类型的列与字符串常量比较,字符串前加 binary 声明。
事前巡检
比如下面的连接条件,code 为 varchar 类型,存在类似下面的连接。
code = BINARY 'XS2504'
事后诊断
SQL 中字符类型的列与字符串常量比较,包含 binary 关键字。
问题原因
简化测试用例,如下。
CREATE TABLE test (code VARCHAR(20));
CREATE INDEX idx_code ON test(code);
obclient [test]> explain SELECT * FROM test WHERE code = BINARY 'XS2504';
+----------------------------------------------------------------------------------------------------------------------+
| Query Plan |
+----------------------------------------------------------------------------------------------------------------------+
| ===================================================== |
| |ID|OPERATOR |NAME|EST.ROWS|EST.TIME(us)| |
| ----------------------------------------------------- |
| |0 |EXCHANGE IN REMOTE | |1 |5 | |
| |1 |└─EXCHANGE OUT REMOTE| |1 |5 | |
| |2 | └─TABLE FULL SCAN |test|1 |4 | |
| ===================================================== |
| Outputs & filters: |
| ------------------------------------- |
| 0 - output([test.code]), filter(nil) |
| 1 - output([test.code]), filter(nil) |
| 2 - output([test.code]), filter([cast(test.code, VARCHAR(1048576)) = cast('XS2504', VARCHAR(1048576))]), rowset=16 |
| access([test.code]), partitions(p0) |
| is_index_back=false, is_global_index=false, filter_before_indexback[false], |
| range_key([test.__pk_increment]), range(MIN ; MAX)always true |
+----------------------------------------------------------------------------------------------------------------------+
15 rows in set (0.013 sec)
常量字符串前声明了 binary 后(BINARY 'XS2504'),会在列上加 cast,导致无法抽取 query range。cast(test.code, VARCHAR(1048576)) = cast('XS2504', VARCHAR(1048576)) 添加 binary 操作之后的字符序类型为 utf8mb4_general_ci, 原本字段的字符序为 utf8mb4_bin。
问题的风险及影响
不能抽取 query range,最后走了全表扫描的计划。
影响租户
影响 OceanBase 数据库中的 SYS 租户和 Oracle 租户以及 MySQL 租户。
影响版本
OceanBase 数据库企业版 V4.2.5 GA(oceanbase-4.2.5.0-100000082024102022)及之后版本、V4.3.5 GA(oceanbase-4.3.5.0-100000122024123020)及之后版本。
解决方法
升级至问题已修复版本。目前已修复的版本包括 OceanBase 数据库企业版 V4.2.5 BP4(oceanbase-4.2.5.4-104000082025052817)及之后版本、V4.3.5 BP2(oceanbase-4.3.5.2-102000162025051417)及之后版本。
暂时避免使用 binary。
规避方式
暂时避免使用 binary。