为什么根据 SQL-92,未加引号的标识符是大写的?

Ser*_*zov 6 syntax sql-standard case-sensitive quoted-identifier

SQL-92 标准的第 5.6 节包含规则 10...13,其中未加引号的标识符应大写,因此foo变为FOO"foo"仍然是foo

例如,Oracle、IBM DB2、SnowflakeksqlDB遵守这些规则,但Postgres 、MySQL 或 SQLite 则不遵守这些规则。

问题是,为什么?根据我的理解,在具有大量关键字的语言中可选地引用标识符是有意义的。标识符一致的区分大小写或不区分大小写也是有意义的。但让它依赖于被引用的标识符看起来并不合理。

我缺少什么?

Dav*_*oft 8

但让它依赖于被引用的标识符看起来并不合理

区分大小写的标识符很糟糕。想象一下名为 Foo、FOO 和 foo 的表的混乱,以及编写 SQL 查询并弄错对象大小写的用户所犯的所有令人沮丧的错误。但一些较旧的 RDBMS 系统本质上是区分大小写的(Oracle 我正在看你)。

因此,将标识符转换为全部大写是一种老式的解决方法,无法支持不区分大小写的目录。

因此create table Foo ...,实际上创建了一个名为“FOO”的表,并且在 SQL 查询中,select * from foo在目录中搜索对象名称之前将对象名称大写。

但支持混合大小写标识符是一个重要的功能。因此,如果常规标识符隐式转换为全部大写,那么在使用 显式分隔的情况下允许混合大小写标识符是有意义的"

例如,SQL Server 具有混合大小写标识符,应用程序可能依赖于从目录中读取混合大小写标识符。在 Oracle 中,可以通过创建具有混合大小写引用标识符的表来实现这一点。

这也描述了Oracle 的实际行为,Oracle 是当时仅有的 RDBMS 系统之一。因此,Oracle 设计也可能正在由 SQL 标准进行编码。


Roh*_*pta 4

最初,没有使用引号。这意味着标识符不能使用保留名称,例如索引。标识符的大小写无关。然而,约定不仅在数据库中使用大写标识符,而且在许多编程语言中也使用大写标识符。

后来允许使用引号,从而可以使用大小写混合标识符以及保留名称。在某些数据库上,您可以选择要使用的选项。

sql-92 标准有点模糊,允许不同语言的行为略有不同。像 Firebird 这样的语言有一些怪癖。Oracle 等较老的公司必须尊重遗留用法。

作为 Firebird/Interbase 中的一个示例,假设正在使用方言 3(告诉数据库将使用带引号的标识符)。如果标识符不加引号,它将被视为 dialect-1 标识符。理论上应该是大写,但实际上大小写无关。

某些语言可能坚持要求标识符大写。但这一切都是因为历史/遗留支持和/或他们在设计中必须做出的新决定。看起来有些人决定让用户更容易,而另一些人则严格遵守标准。

标准

记住这些语言最初并不是为了遵守标准而设计的,更不用说 sql-92 了。它们经过调整以符合标准。因此,实现方式略有不同。