处理SQL保留的表和列名称

时间:2014-09-19 07:14:53

标签: mysql sql sql-server oracle postgresql

有没有办法处理保留的表&您的应用中的列名称可以通过各种数据库工作,如Oracle,MySQL,SQL Server,PostGreSQL等。

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

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

我知道ANSI标准声明使用双引号,但遗憾的是并非所有dbms似乎都支持它们。

1 个答案:

答案 0 :(得分:6)

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

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

SET SESSION sql_mode = 'ANSI'

(我在这里使用ANSI而不只是ANSI_QUOTES,因为它使得MySQL通常更加健全。)

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

Oracle也没有。

现代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”的人......)