无法将减号插入具有检查约束的 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 collation会导致('-' = '')
求值为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
我有一个 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 collation会导致('-' = '')
求值为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