【问题标题】:Determine if a word is a reserved word in Apache Derby确定一个单词是否是 Apache Derby 中的保留字
【发布时间】:2016-01-25 20:49:00
【问题描述】:

有没有办法只转义保留字的列?

例如,我想使用 java 生成以下语句:

create table person(id int, name varchar(255), "year" int);

注意到“年”必须被转义,因为它是一个保留字?有没有办法判断一个字符串是否是保留字?

我不只是转义所有列的原因是因为我希望查询看起来像这样:

select id, name, "year" from person

而不是这样:

select "id", "name", "year" from person

【问题讨论】:

  • 不使用保留字怎么样?例如,year 代表什么?出生年份?如果是这样,为什么不这样称呼它?也让其他人更容易知道它是什么。
  • 谢谢安德烈亚斯,“年”只是一个例子。我正在以编程方式生成表格。这些列实际上代表了几十个不同类中的字段。
  • 如果您以编程方式生成表及其查询,只需在all表名和列名周围加上引号。没有理由不这样做,这样即使 SQL 标准委员会将来添加新的保留字,您也是安全的。
  • 有,DatabaseMetaData.getSQLKeywords(),但它只包含保留在 SQL:2003 关键字之上的字词(并且仅当驱动程序供应商费心使其保持最新和完整时),所以你会仍然需要有自己的 SQL:2003 关键字列表。 JDBC 4.3 计划在必要时包含元数据函数以引用对象名称。

标签: java jdbc derby reserved-words


【解决方案1】:

从通用的JDBC角度来看,有一种确定关键字的方法,使用SQL:2003关键字列表(需要自己获取)+DatabaseMetaData.getSQLKeywords()的结果:

检索此数据库的所有 SQL 关键字的逗号分隔列表,这些关键字也不是 SQL:2003 关键字。

但这取决于 JDBC 驱动程序中的关键字列表是否完整且是最新的,但情况并非总是如此。我不知道德比是不是这样。如果您正在编写通用软件,最好总是引用以避免麻烦。

计划在 JDBC 4.3 中包含引用对象名称的功能(即给定一个字符串,它将按原样返回字符串(无需引用),在必要时引用或抛出 SQLException 如果对象名称是无效或无法引用)。这不是最终的 IIRC,然后需要等待驱动程序供应商实现它..

【讨论】:

    猜你喜欢
    • 2013-04-15
    • 2014-09-03
    • 2020-02-11
    • 2015-02-03
    • 1970-01-01
    • 1970-01-01
    • 2015-04-29
    • 2012-10-17
    • 1970-01-01
    相关资源
    最近更新 更多