【问题标题】:Why can you have a column named ORDER in DB2?为什么在 DB2 中可以有一个名为 ORDER 的列?
【发布时间】:2008-10-29 02:16:04
【问题描述】:

在 DB2 中,您可以将列命名为 ORDER 并像这样编写 SQL

SELECT ORDER FROM tblWHATEVER ORDER BY ORDER

甚至不需要在列名周围放置任何特殊字符。这让我很痛苦,我不会进入,但我的问题是:为什么数据库允许对对象名称使用 SQL 关键字?当然,不允许这样做更有意义吗?

【问题讨论】:

  • 拜托,拜托,“进入”痛苦——我想看看细节:-)。
  • select order from order by order - 那将是一个美丽!!!
  • 或者,选择订单,从订单订单中分组,group.group where order.order = group.order order by group.group,order.order group by group.group - cripes,我没有甚至知道这是否会再解析 - 我需要躺下......
  • 这不是那么有趣,抱歉。在 Oracle 中重新创建 DB2 表(结构和数据)的代码不喜欢名为 ORDER 的列。
  • 哈哈。我命令你躺下,帕克斯。

标签: sql database db2


【解决方案1】:

我在很大程度上同意不应允许关键字作为标识符的观点。大多数现代计算语言都有 20 或 30 个关键字,在这种情况下,暂停将它们用作标识符是完全合理的。不幸的是,SQL 来自旧的 COBOL 语言学校(“计算语言应尽可能与英语相似”)。因此,SQL(如 COBOL)有多个hundred keywords

我不记得 SQL 标准是否对保留字 必须 被允许作为标识符有任何规定,但考虑到广泛的(过多的!)词汇,一些 SQL 实现允许它并不奇怪。

话虽如此,使用关键字作为标识符并不像 SQL 中引用标识符的整个概念那么愚蠢(而且这些不是 DB2 特有的)。允许区分大小写的标识符是一回事,但带引号的标识符允许各种废话,包括空格、变音符号以及在某些实现(是的,包括 DB2)中,控制字符!试试下面的例子:

创建表“我的 表”(一个整数非空);

是的,这是标识符中间的换行符以及末尾的 e-acute...(这导致了对数据库元数据使用什么编码以及因此是否非 Unicode例如,数据库将允许包含日文列名的表定义)。

【讨论】:

    【解决方案2】:

    许多 SQL 解析器(尤其是我使用的 DB2/z)比一些常规解析器更智能,后者有时会完全分离词法和语义分析(这种分离主要是件好事)。

    SQL 解析器可以根据上下文判断关键字是否有效或应被视为标识符。

    因此,您可以获得称为 ORDER 或 GROUP 或 DATE 的列(这是一个特别常见的列)。

    当一些语法着色编辑器用关键字颜色标记标识符时,它确实让我很恼火。他们的解析器不像 DB2 中的那样“聪明”。

    【讨论】:

      【解决方案3】:

      因为对象名称是...名称。所有数据库系统都允许您使用带引号的名称来避免遇到麻烦。

      如果您遇到问题,问题不在于允许对象名称为 names 的做法,而在于错误的实现,或者错误的代码库不能自动引用所有内容或不能根据需要引用名称。

      【讨论】:

      • 同意,但是:不自动引用/括号列名的代码非常普遍。当我设计一张桌子时,一些宇宙力量总是阻止我命名一列“订单”或“日期”或“为什么是空间”,即使我可以。如果我这样做肯定会破坏某些东西。
      • @MusiGenesis:你怎么称呼你的日期和时间列?
      • 在我自己的项目中,我总是为所有表/列/等名称使用带引号的名称,并且对于命名任何我认为最有意义的东西都不会感到内疚。
      • @Pax:如果我继承了一个列名称为 DATE 和 TIME 的数据库,我会非常恼火——这是什么意思?它是什么时候创建的?什么时候修改的?什么时候到期?我会使用有意义的名称,例如 CREATEDDATE、LASTMODIFIEDTIME 等。
      • @Justice:这个项目的一个特别之处是我们的开发人员必须编写将在 SQL Server、Oracle 或 DB2 版本的数据库上运行的 SQL。由于所有三个引用列名的方式都不同([]、"" 和 '' 或什么都没有),这不是一个简单的问题。
      【解决方案4】:

      有趣的是,您也可以在 SqlServer 中使用关键字作为字段名称。唯一的区别是您需要在字段名称中使用括号

      所以你可以做类似的事情

      create table [order](
      id int,
      [order] varchar(50) )
      

      然后:)

      select 
          [order] 
      from 
          [order]
      order by [order]
      

      这当然是一个有点极端的例子,但至少通过使用括号你可以看到 [order] 不是关键字。

      我会看到人们使用已经被关键字保留的名称的原因是当列名或表名与数据表示之间存在直接映射时。你可以称之为懒惰或方便。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-14
        • 1970-01-01
        • 2014-08-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多