H2数据库的sql子句IN中太短的字符未正确填充

问题描述 投票:0回答:1

我在 H2 中有一个带有 char 列的表。

create table mytable (col_fixed_width char(4));
insert into mytable (col_fixed_width) values ('01  ');
insert into mytable (col_fixed_width) values ('02  ');

当我在 sql 子句 where 中使用等号或具有唯一值的 sql 子句 IN 时,我会得到结果。 H2 正确完成了正确的填充。

但是当我将 sql 子句 IN 与多个值一起使用时,查询不会返回任何内容。正确的填充不起作用。

SELECT * from mytable where col_fixed_width='01'; -- OK
SELECT * from mytable where col_fixed_width IN ('01'); -- OK
SELECT * from mytable where col_fixed_width IN ('01', '02');  -- KO
SELECT * from mytable where col_fixed_width IN ('01') OR col_fixed_width IN ('02');  -- KO
SELECT * from mytable where col_fixed_width IN ('01  ', '02  '); -- OK
SELECT * from mytable where col_fixed_width IN ('01  ') OR col_fixed_width IN ('02  '); -- OK

如有任何帮助了解该问题,我们将不胜感激。

h2 v2.1.214

sql h2
1个回答
0
投票

切勿将

CHARACTER
(
CHAR
) 数据类型用于可变长度字符串。为此,SQL 有
CHARACTER VARYING
(
VARCHAR
) 数据类型。

CHARACTER

数据类型的值在右侧用空格填充到数据类型的声明长度,当您尝试将这些值与其他长度的字符串进行比较时,它们是否会被视为相等是一个复杂的问题。根据 SQL 标准,它们可能相等,就像它们可能不相等一样,因为 
01
01
 的相等性应该仅取决于排序规则的特征。

H2 不支持按列、按数据类型或按值排序规则,但 H2 对于

CHARACTER

 数据类型有历史性的肮脏技巧,并且通常与此数据类型的比较有效地使用具有 
PAD SPACE
 特性的排序规则,与比较操作不同与其他字符串,它们默认使用一些具有 
NO PAD
 特征的排序规则。

不幸的是,这个技巧不适用于

IN

 谓词,这是一个已知的尚未解决的错误:
https://github.com/h2database/h2database/issues/3385

最简单的解决方法是根据您的需要正确选择数据类型。如果所有可能的值具有完全相同的长度,您可以使用具有此长度的

CHARACTER

 数据类型,在所有其他情况下,应避免这种过时的设计缺陷数据类型,其空格填充是各种问题的根源。

© www.soinside.com 2019 - 2024. All rights reserved.