【问题标题】:Handling SQL reserved table and column names处理 SQL 保留的表和列名
【发布时间】:2014-11-13 17:17:09
【问题描述】:

有没有办法在你的应用程序中处理保留的表和列名,它可以在各种数据库中工作,如 Oracle、MySQL、SQL Server、PostGreSQL 等。

目前,我必须执行以下操作:

Oracle - 使用双引号。 MySQL - 使用反引号或双引号(取决于是否启用 ANSI_QUOTES 模式) SQL Server - 使用括号 PostGreSQL - 使用双引号。

我知道 ANSI 标准规定使用双引号,但不幸的是,并非所有 dbms 似乎都支持它们。

【问题讨论】:

  • 很遗憾没有。您可以编写一个小脚本来解析 SQL 并将引用字符替换为所需的字符,但 RDBMS 之间在这方面没有一致性。
  • 谢谢。但是,DataBaseMetaData.getIdentifierQuoteString() 中有一个 API,它倾向于给出适当的引用。我在 MySQL 上试过这个并返回一个反引号。其他数据库供应商可以依赖此 API 吗? (任何建议0
  • SQL Server 不也支持双引号吗?
  • 所以我已经测试过了,SQL Server 使用双引号,就像 ANSI 指定的一样。那你的问题解决了吗?
  • 看来我们必须设置 SET QUOTED_IDENTIFIER ON 才能在 SQL Server 中启用双引号。但是,我相信有配置要求应该没问题。所以,我可以继续使用双引号。非常感谢大家..

标签: mysql sql sql-server oracle postgresql


【解决方案1】:

使用双引号。这就是标准所说的,令人惊讶的是,它实际上适用于大多数平台。

要求 MySQL 启用ANSI_QUOTES,或set it at the session level

SET SESSION sql_mode = 'ANSI'

(我在这里使用了ANSI 而不仅仅是ANSI_QUOTES,因为它使 MySQL 通常更理智一些)。

PostgreSQL 不需要对标识符进行任何特殊设置(尽管非常旧的版本需要 standard_conforming_strings = on 来合理地处理文字)。

甲骨文也没有。

现代 MS-SQL shouldn't require any special settings to support double quoted identifiers:

当 SET QUOTED_IDENTIFIER 为 ON(默认)时,所有由双引号分隔的字符串都被解释为对象标识符

文档表明 MS-SQL 2008 就是这种情况,如果您仍然关心新应用程序中的 2005,那么您将遇到更大的问题。

SQLFiddles:

有趣的是,我发现 PostgreSQL 的 SQLFiddle 失败并出现一个奇怪的错误。我怀疑一个 SQLFiddle 错误,因为它在 PostgreSQL 命令行和通过 PgJDBC 上都很好。它以there is no table that match the following pattern [with] 失败。

说了这么多,如果你是认真地尝试编写 ANSI SQL,我希望你不打算使用:

  • 日期/时间数学
  • 字符串连接
  • 非平凡聚合
  • 窗口函数(MySQL 还不支持)
  • 常用表表达式
  • SQL/XML
  • 任意精度十进制数据类型
  • 任何类型的用户定义过程或函数
  • 任何类型的用户定义类型
  • ...更多

因为不同的供应商使用不同的名称,对功能的支持不同等。

(顺便说一句,如果我在黑暗的小巷里遇到一个决定将 Microsoft SQL Server 称为“SQL”的人......)

【讨论】:

  • 是的。但是,即使是 SQL Server 也需要启用类似的设置。
  • @MuraM 不是最近的版本。
  • 我们知道,启动哪个版本的 SQL Server 默认支持双引号?
  • @MuraM 根据链接的文档,至少 2008 年,如果不是更早的话。正如我所说,如果你仍然关心 2005 年,那么你就有大问题了。
  • 我可能错了,但根据链接的文档,它说“适用于:SQL Server(SQL Server 2008 到当前版本)”,这应该意味着特殊设置(SET QUOTED_IDENTIFIER { ON | OFF }) 应该启用,对吧?
猜你喜欢
  • 1970-01-01
  • 2022-01-20
  • 1970-01-01
  • 2020-10-31
  • 1970-01-01
  • 2017-10-14
  • 2021-04-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多