为什么PostgreSQL默认一切都是小写的?

Ham*_*ro. 5 postgresql case-sensitive

我试图在使用MySQL(5.1)之后熟悉Postgres(9.2),因为我被一些MySQL的陷阱所困扰.然而,在我与Postgres的前五分钟里,我碰到了其中一个陷阱,我确信每个人都会遇到它:

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

这对我来说并不算太大,因为有几个明显的解决方法:

  • 用引号封装所有内容.
  • 允许以小写方式命名所有内容.

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

Chr*_*ers 7

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

然而,PostgreSQL通过折叠到小写而偏离标准.一般的原因是为什么这被认为更具可读性等等,因为你可以使用case来提示语法.就像是:

SELECT foo FROM bar WHERE baz = 1;
Run Code Online (Sandbox Code Playgroud)

当病例折叠到较低时,这更自然.另一种折叠方式是:

select FOO from BAR where BAZ = 1;
Run Code Online (Sandbox Code Playgroud)

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

总的来说,我在postgres邮件列表上看到的大多数讨论都是每个人都同意标准规定的行为被打破.所以以上就是我对这些问题的理解.

  • 你确实想知道标准作者在吸什么。 (4认同)
  • 我不明白为什么折叠为小写(偏离标准)有助于可读性,因为您编写的 SQL 可以是您想要的任何大小写。仅仅因为 ORACLE 存储 FOO 和 BAR 并不能阻止您编写 SELECT foo FROM bar; (2认同)