问题现象
char 或 nchar 类型的列在加索引后,使用 like 'x' 谓词过滤后查询结果和 Oracle 不一致。
关键诊断信息
触发条件
char 或 nchar 类型的列在加索引后,使用 like 'x' 谓词过滤。
问题原因
nchar 和 char 类型是固定长度的,字符串不足的长度补空至固定长度,因此对于 c1 = 'x',其实际值为 c1 = 'x ' 对于 c1 = 'x',等值查询时忽略空格; 对于 c1 like 'x',要求 pattern 精确匹配,不忽略空格,预期查不出数据。但是目前我们会抽出 [x;x] 的 range,并认为是精确抽取的,导致 'x ' 未被过滤掉,最终查询出了数据,不符合预期。
问题的风险及影响
查询结果和 Oracle 不一致。
影响租户
影响 OceanBase 数据库中的 Oracle 租户,对于 SYS 租户和 MySQL 租户无影响。
影响的版本
OceanBase 数据库企业版 V2.2.77 GA(oceanbase-2.2.77-20210508211731)及之后版本、V3.1.2 GA(oceanbase-3.1.2-20210618150922)及之后版本、V3.2.3 GA(oceanbase-3.2.3.0-20220418212020)及之后版本。
解决方法
升级至问题已修复版本。目前已修复的版本包括 OceanBase 数据库企业版 V2.2.77 BP14(oceanbase-2.2.77-114000072022120410)及之后版本、V3.1.2 BP11(oceanbase-3.1.2-111000052023010412)及之后版本、V3.2.3 BP6(oceanbase-3.2.3.3-106000102022111521)及之后的版本。
将
like 'x'条件改为等值条件= 'x'。
规避方式
将 like 'x' 条件改为等值条件 = 'x'。