使用 HSQLDB 关键字的奇怪行为

Posted

技术标签:

【中文标题】使用 HSQLDB 关键字的奇怪行为【英文标题】:Strange behavior by using the keyword of HSQLDB 【发布时间】:2011-10-10 14:58:05 【问题描述】:

在 HSQLDB 中创建新表时出现奇怪的结果。从HSQLDB的文档来看,“user”是一个关键字,一般情况下我们不能用这个值作为表名或者列名,除非是双引号。

但是,我可以创建一个名称为“USER”的数据库表和一个名称为“user”的数据库表 DATA_RESULT,而无需双引号。

从数据库读取数据时出现问题。例如,当我执行:"select * from DATA_RESULT" 并从 ResultSet 中读取“user”的值时,它可以工作。

如果我执行"select user from DATA_RESULT""SELECT * from DATA_RESULT where user = 1",就会发生错误。 sql语句执行不正确,ResultSet.next()总是返回false。

此外,从Lists of Keywords for HSQLDB,它说HyperSQL has two modes of operation, which are selected with the SET DATABASE SQL NAMES TRUE | FALSE to allow or disallow the keywords as identifiers. The default mode is FALSE and allows the use of most keywords as identifiers,它没有说明“用户”是否可以用作标识符。

我正在使用 HSQLDB 2.0.0。

这很令人困惑。有人知道这里发生了什么吗?

提前致谢!任何建议都会有所帮助。

【问题讨论】:

【参考方案1】:

USER 是一个获取当前用户名的函数。例如:

CALL USER

您当然可以使用 USER 作为表名或列名。

在 SELECT 语句中,在名称周围使用双引号。

CREATE TABLE DATA_RESULT ("USER" INT, DATA VARCHAR(100))
SELECT * FROM DATA_RESULT WHERE "USER" = 1

当使用双引号时,大小写必须匹配。

请注意,网站上的指南会定期更新,目前对应最新版本 2.2.5。

【讨论】:

以上是关于使用 HSQLDB 关键字的奇怪行为的主要内容,如果未能解决你的问题,请参考以下文章

hsqldb 中时间戳大小的奇怪行为

cfscript中IF块内的coldfusion continue关键字/奇怪的行为

如何使用看起来像 HSQLDB 关键字的列名创建表?

使用 Hibernate 更新 HSQLDB 上的 LOB/BLOB 值会产生数据异常

HSQLDB 索引不一致

SQLSyntaxErrorException:由于 HSQLDB 中的“COALESCE”导致的数据类型异常