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