在 DB2 中,您可以将列命名为 ORDER 并编写如下 SQL
SELECT ORDER FROM tblWHATEVER ORDER BY ORDER
甚至不需要在列名周围放置任何特殊字符。这让我感到痛苦,我不会进入,但我的问题是:为什么数据库允许对对象名称使用 SQL 关键字?当然,不允许这样做会更有意义吗?
我在很大程度上同意不应允许关键字作为标识符的观点。大多数现代计算语言都有 20 或 30 个关键字,在这种情况下,暂停将它们用作标识符是完全合理的。不幸的是,SQL 来自旧的 COBOL 语言学校(“计算语言应尽可能与英语相似”)。因此,SQL(如 COBOL)有数百个关键字。
我不记得 SQL 标准是否说明了是否必须允许保留字作为标识符,但考虑到广泛的(过多的!)词汇,几个 SQL 实现允许它并不奇怪。
话虽如此,使用关键字作为标识符并不像 SQL 中引用标识符的整个概念那样愚蠢(而且这些不是 DB2 特定的)。允许区分大小写的标识符是一回事,但带引号的标识符允许各种废话,包括空格、变音符号以及在某些实现中(是的,包括 DB2),控制字符!试试下面的例子:
创建表“我的 表”(一个整数非空);
是的,这是标识符中间的换行符以及末尾的 e-acute ......(这导致了对数据库元数据使用什么编码以及因此非 Unicode 数据库是否允许的有趣猜测,比如说,包含日文列名的表定义)。
许多 SQL 解析器(尤其是我使用的 DB2/z)比某些有时完全分离词法和语义分析的常规解析器更智能(这种分离主要是一件好事)。
SQL 解析器可以根据上下文确定关键字是否有效或应被视为标识符。
因此,您可以获得称为 ORDER 或 GROUP 或 DATE 的列(这是一个特别常见的列)。
当一些语法着色编辑器用关键字颜色标记标识符时,它确实让我很恼火。他们的解析器不像 DB2 中的解析器那么“聪明”。
因为对象名称是...名称。所有数据库系统都允许您使用带引号的名称来防止您遇到麻烦。
如果您遇到问题,问题不在于允许对象名称为names的做法,而在于错误的实现,或者错误的代码库不会自动引用所有内容或无法根据需要引用名称。
有趣的是,您也可以在 SqlServer 中使用关键字作为字段名称。您需要在字段名称中使用括号的唯一区别
所以你可以做类似的事情
create table [order](
id int,
[order] varchar(50) )
进而 :)
select
[order]
from
[order]
order by [order]
这当然是一个极端的例子,但至少使用括号你可以看到 [order] 不是关键字。
我会看到人们使用已经被关键字保留的名称的原因是当列名或表名与数据表示之间存在直接映射时。你可以称之为懒惰或方便。