无法使用检查约束(列<>'')将减号插入varchar列

时间:2015-03-08 00:33:44

标签: java sql jdbc h2

我有一个带有varchar列的H2表,其中的检查约束定义如下:

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数据库中的某种字符串文字运算符吗?如果是的话,我该如何逃避呢?

enter image description here

2 个答案:

答案 0 :(得分:2)

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

- &GT;对于新的测试数据库,我没有指定排序规则,但是使用&#34; COLLATION = ENGLISH STRENGTH PRIMARY&#34;创建应用程序数据库。

我真的没想到主要的力量整理会导致('-' = '')评估为真......我将不得不重新审视几年前我自己的问题:H2 database collation strength: what to choose?

我再次非常困惑并且不确定我应该使用哪种排序规则。

答案 1 :(得分:1)

如上所述,H2使用java.text.Collat​​or,因此您可以获得与该类相同的结果。例如:

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