我在 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
切勿将
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
数据类型,在所有其他情况下,应避免这种过时的设计缺陷数据类型,其空格填充是各种问题的根源。