【问题标题】:Problems with escaping table and field names in Derby and Hsqldb在 Derby 和 Hsqldb 中转义表和字段名的问题
【发布时间】:2011-03-08 11:02:41
【问题描述】:

我的ORMLite package 有问题。当我为表生成架构时,我认为转义所有实体名称是一个好习惯。这将保护一些 Java 类或字段名不成为 SQL 保留字:

CREATE TABLE "footable" ("stuff" VARCHAR(255))

我现在添加“原始”查询支持,以便 ORMLite 可以帮助用户执行他们自己的查询。但是,我发现使用 Derby 和 Hsqldb,实体名称不能在 没有 转义的情况下使用。例如,以下查询:

SELECT * FROM footable

产生以下错误:

Derby: ERROR 42X05: Table/View 'FOOTABLE' does not exist.
Hsqldb: Table not found in statement [select * from footable]

如果选择表也被转义为"footable",它工作正常。 ORMLite 支持的其他数据库无论是否使用转义都可以正常工作:MySQL、Postgres、Microsoft SQL Server、H2 和 Sqlite。

有没有更好的方法来转义 Derby 和 Hsqldb 中的保留字?关于如何以便携方式执行此操作的其他想法?

谢谢。

【问题讨论】:

    标签: java orm hsqldb derby ormlite


    【解决方案1】:

    您只需确保大小写匹配即可。

    如果是这样的话:

    create table "Footable" ("Stuff" varchar (25))

    那么它必须是:

    insert into "Footable" ("Stuff") values 'hi mom'

    如果表/列名用双引号括起来,大小写保持不变。

    如果表/列名不在双引号中,那么 Derby 会不区分大小写地处理它。

    【讨论】:

    • 感谢布莱恩。我在 CREATE 和 SELECT 语句中都使用了相同的情况,因此您的答案最初似乎不合适。但是我现在看到(根据我在下面的回答)这是一个案例问题,只是 Derby 和 Hsqldb 将未引用的名称推广为全部大写。
    【解决方案2】:

    非常感谢 Bryan 带领我走上这条路,尽管他的回答不太正确。

    事实证明,因为我将数据库创建为 "footable",然后,正如 Bryan 所说,它将区分大小写。但是,当我在 footable 没有 引号)上进行选择时,Derby 和 Hsqldb 将其推广为全部大写,所以我实际上是这样做的:

    SELECT * FROM FOOTABLE
    

    这不是要在没有引号的情况下不区分大小写(这会起作用),而是要在没有引号时将实体名称全部大写,然后按大小写匹配。我认为这里有一个错误......

    无论如何,我已经更改了我的 Derby 和 Hsqldb 以将 ORMLite 中的所有实体名称大写,并且一切正常。丑陋的国际海事组织,但工作。

    【讨论】:

      猜你喜欢
      • 2012-01-28
      • 1970-01-01
      • 2021-02-12
      • 1970-01-01
      • 2011-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多