7

在使用了相当多的 MySQL (5.1) 之后,我正试图让自己熟悉 Postgres (9.2),因为我已经被一些MySQL 的陷阱咬住了。然而,在我使用 Postgres 的前五分钟里,我遇到了它的一个陷阱,我相信每个人都会遇到这个问题:

  • 默认情况下,PostgreSQL 将所有未引用的内容转换为小写。

这对我来说没什么大不了的,因为有几个明显的解决方法:

  • 将所有内容封装在引号中。
  • 允许以小写方式命名所有内容。

但我想知道为什么。考虑到我想象这个设计决定会引起多少争论,我很惊讶我在互联网上找不到任何理由。有没有人有详尽的解释,或者最好是一些开发者宣言的链接,为什么 Postgres 是这样设计的?我很感兴趣。

4

1 回答 1

8

SQL 标准规定将不带引号的标识符折叠为大写。许多其他 RDBMS 以这种方式遵循标准。Firebird 和 Oracle 都可以。这意味着标识符匹配默认情况下不区分大小写。当涉及到基本查询的兼容性时,此行为非常重要。在这方面 MySQL 的行为是一个真正的异常值。

然而 PostgreSQL 通过折叠成小写偏离了标准。这被认为更具可读性是有一般原因的,等等,因为您可以使用案例来提示语法。就像是:

SELECT foo FROM bar WHERE baz = 1;

当箱子折叠得更低时,这更自然。对面的替代折叠将是:

select FOO from BAR where BAZ = 1;

一般来说,就像前一种行为(折叠成小写)一样,因为它更好地强调了 sql 操作,而折叠到另一种情况则不强调操作并强调标识符。鉴于许多查询的复杂性,我认为前者效果更好。

一般来说,我在 postgres 邮件列表上看到的最多的讨论是每个人都同意标准规定的行为被破坏了。所以以上是我对这些问题的理解。

于 2013-04-13T03:57:24.383 回答