gpt4 book ai didi

mysql - 处理 SQL 保留表名和列名

转载 作者:行者123 更新时间:2023-11-29 04:07:39 25 4
gpt4 key购买 nike

有没有一种方法可以在您的应用程序中处理保留的表和列名称,这些名称可以通过各种数据库(如 Oracle、MySQL、SQL Server、PostGreSQL 等)工作

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

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

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

最佳答案

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

要求 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 :

When SET QUOTED_IDENTIFIER is ON (default), all strings delimited by double quotation marks are interpreted as object identifiers

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

SQLFiddles:

有趣的是,我发现 PostgreSQL 的 SQLFiddle 失败并出现了一个奇怪的错误。我怀疑是 SQLFiddle 错误,因为它在 PostgreSQL 命令行和通过 PgJDBC 上都很好。它失败并显示 没有匹配以下模式的表 [with]

综上所述,如果您认真地尝试编写 ANSI SQL,我希望您不打算使用:

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

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

(附带说明,如果我在黑暗的小巷里遇到决定将 Microsoft SQL Server 称为“SQL”的人...)

关于mysql - 处理 SQL 保留表名和列名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25928357/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com