无法将减号插入具有检查约束的 varchar 列(列 <> '')

Cannot insert minus sign into varchar column with check constraint (column <> '')

我有一个 H2 table,它有一个 varchar 列,检查约束定义如下:

CONSTRAINT my_constraint CHECK (varchar_field <> '')

以下插入语句失败,但当我删除约束或插入任何其他值而不仅仅是减号(“-”)时成功。

PreparedStatement ps= con.prepareStatement("INSERT INTO my_table (id, varchar_field) VALUES (?, ?);");
ps.setInt(1, id);
ps.setString(2, "-"); 
ps.executeUpdate();

更新:进一步的测试揭示了我不理解的行为。 SQL/H2 数据库中的减号是某种字符串文字运算符吗?如果是,我该如何逃脱?

根据 Gord 的评论,我用 H2 1.3.176 进行了测试,但我仍然遇到同样的问题。当我创建一个新的测试数据库时,我没有观察到这个问题。

-> 对于新的测试数据库,我没有指定排序规则,但应用程序数据库是使用 "COLLATION=ENGLISH STRENGTH PRIMARY".

创建的

真没想到primary strength collat​​ion会导致('-' = '')求值为true...我得重温一下自己几年前的问题:H2 database collation strength: what to choose?.

我又一次很困惑,不确定我应该使用什么排序规则。

如文档所述,H2 使用 java.text.Collator,因此您得到与 class 相同的结果。示例:

java.text.Collator c = Collator.getInstance();
c.setStrength(Collator.PRIMARY);
System.out.println(c.compare("-", "") == 0);
System.out.println(c.compare("-", "  ") == 0);
System.out.println(c.compare("-", "--") == 0);

结果:

true
true
true