我试图在使用MySQL(5.1)之后熟悉Postgres(9.2),因为我被少数MySQL's gotchas咬了一口。然而,在我与Postgres的前五分钟里,我碰到了its gotchas中的一个,我肯定会碰到所有人:
这对我来说并不算太大,因为有几个明显的解决方法:
但我想知道为什么。考虑到我想象这个设计决定导致了多少争用,我很惊讶我在互联网上找不到任何理由。有没有人有一个彻底的解释,或者最好是一些开发者宣言的链接,为什么Postgres是这样设计的?我很感兴趣。
答案 0 :(得分:7)
SQL标准指定将不带引号的标识符折叠为大写。许多其他RDBMS都以这种方式遵循标准。 Firebird和Oracle都这样做。这意味着默认情况下,标识符匹配不区分大小写。在基本查询中的兼容性时,此行为非常重要。在这方面,MySQL的行为是一个真正的异常值。
然而,PostgreSQL通过折叠到小写而偏离标准。一般的原因是为什么这被认为更具可读性等等,因为你可以使用case来提示语法。类似的东西:
SELECT foo FROM bar WHERE baz = 1;
当折叠到较低的情况时,这更自然。另一种折叠方式是:
select FOO from BAR where BAZ = 1;
通常像前一种行为(折叠到小写)一样,因为它更好地强调了sql操作,而折叠到另一种情况则不再强调操作并强调标识符。鉴于许多查询的复杂性,我认为前者效果更好。
总的来说,我在postgres邮件列表上看到的大多数讨论都是每个人都同意标准规定的行为被打破。以上就是我对这些问题的理解。