Ser*_*zov 6 syntax sql-standard case-sensitive quoted-identifier
SQL-92 标准的第 5.6 节包含规则 10...13,其中未加引号的标识符应大写,因此foo
变为FOO
但"foo"
仍然是foo
。
例如,Oracle、IBM DB2、Snowflake和ksqlDB遵守这些规则,但Postgres 、MySQL 或 SQLite 则不遵守这些规则。
问题是,为什么?根据我的理解,在具有大量关键字的语言中可选地引用标识符是有意义的。标识符一致的区分大小写或不区分大小写也是有意义的。但让它依赖于被引用的标识符看起来并不合理。
我缺少什么?
但让它依赖于被引用的标识符看起来并不合理
区分大小写的标识符很糟糕。想象一下名为 Foo、FOO 和 foo 的表的混乱,以及编写 SQL 查询并弄错对象大小写的用户所犯的所有令人沮丧的错误。但一些较旧的 RDBMS 系统本质上是区分大小写的(Oracle 我正在看你)。
因此,将标识符转换为全部大写是一种老式的解决方法,无法支持不区分大小写的目录。
因此create table Foo ...
,实际上创建了一个名为“FOO”的表,并且在 SQL 查询中,select * from foo
在目录中搜索对象名称之前将对象名称大写。
但支持混合大小写标识符是一个重要的功能。因此,如果常规标识符隐式转换为全部大写,那么在使用 显式分隔的情况下允许混合大小写标识符是有意义的"
。
例如,SQL Server 具有混合大小写标识符,应用程序可能依赖于从目录中读取混合大小写标识符。在 Oracle 中,可以通过创建具有混合大小写引用标识符的表来实现这一点。
这也描述了Oracle 的实际行为,Oracle 是当时仅有的 RDBMS 系统之一。因此,Oracle 设计也可能正在由 SQL 标准进行编码。
最初,没有使用引号。这意味着标识符不能使用保留名称,例如索引和表。标识符的大小写无关。然而,约定不仅在数据库中使用大写标识符,而且在许多编程语言中也使用大写标识符。
后来允许使用引号,从而可以使用大小写混合标识符以及保留名称。在某些数据库上,您可以选择要使用的选项。
sql-92 标准有点模糊,允许不同语言的行为略有不同。像 Firebird 这样的语言有一些怪癖。Oracle 等较老的公司必须尊重遗留用法。
作为 Firebird/Interbase 中的一个示例,假设正在使用方言 3(告诉数据库将使用带引号的标识符)。如果标识符不加引号,它将被视为 dialect-1 标识符。理论上应该是大写,但实际上大小写无关。
某些语言可能坚持要求标识符大写。但这一切都是因为历史/遗留支持和/或他们在设计中必须做出的新决定。看起来有些人决定让用户更容易,而另一些人则严格遵守标准。
标准
记住这些语言最初并不是为了遵守标准而设计的,更不用说 sql-92 了。它们经过调整以符合标准。因此,实现方式略有不同。
归档时间: |
|
查看次数: |
881 次 |
最近记录: |