具有 hsqldb 脚本文件的唯一约束违规异常(未读取空格字符)

Posted

技术标签:

【中文标题】具有 hsqldb 脚本文件的唯一约束违规异常(未读取空格字符)【英文标题】:Unique Constraint Violation excpetion with hsqldb script file (Space chracters not read) 【发布时间】:2016-08-30 14:13:20 【问题描述】:

我正在尝试使用其脚本文件重新创建和读取 HSQL 数据库。在其中一个表中,我在一对列上有一个 Unique Constraint。 一些数据行包含其中一列的重复字段,但末尾有一个空格。例如:“Java”和“Java” 所以基本上它们形成了两个不同的数据集,但是 hsql 报告这两个数据集的**完整性约束违反**错误。 该数据库是由使用 HSQLDB 的应用程序在内部形成的,因此我无法修改脚本文件。 (尽管我尝试通过将 unicode 字符替换为空格字符来进行测试,但它也不起作用。) 有没有办法告诉 hsqldb 将带有空格的文本值视为不同的数据集。 注意:我使用Java访问和读取hsql数据库,并且我通过HSQLDB的嵌入式swing GUI管理器测试了脚本文件,两种情况下的结果都是一样的。

【问题讨论】:

【参考方案1】:

您的问题有两种选择:

该列被声明为 CHAR :SGBD 将用空格填充尾随空格,因此两个字符串将相等,您无法更改。 该列被声明为 VARCHAR :默认情况下,HSQL 将使用空格 PAD 完成最短字符串以匹配第二个字符串的大小,然后进行比较。所以最后这两个字符串在你的情况下是相等的。

但是,对于情况 2,您可以更改 hsql 的行为。

查看文档,特别是:SET DATABASE COLLATION SQL_TEXT NO PAD

database collation

【讨论】:

以上是关于具有 hsqldb 脚本文件的唯一约束违规异常(未读取空格字符)的主要内容,如果未能解决你的问题,请参考以下文章

HSQLDB:奇怪的“唯一约束或索引违规”,从CSV读取数据

HSQLDB 内存设置的 HSQLDB 约束违规和 SQL 查询日志

HSQLDB:REPLACE INTO 表抛出 org.hsqldb.HsqlException:完整性约束违规:

具有唯一索引和主键的列给出唯一约束违规

具有序列提供的 id 的主键列上的唯一约束违规

HSQLDB 和唯一约束