2012-11-16 13 views
5

Próbuję do zapoznania się z PostgreSQL (9.2) po uczciwej trochę MySQL (5.1) użytkowania, odkąd został ugryziony przez garstkę MySQL's gotchas. Jednak w pierwszych pięciu minutach PostgreSQL wpadłem do jednego z its gotchas, który jestem pewien ciosy wszystkim:Dlaczego PostgreSQL domyślnie wszystko do małych liter?

  • Domyślnie PostgreSQL konwertuje wszystko, co nie jest notowany na małe litery.

To nie jest zbyt wielkiego dla mnie, ponieważ istnieje kilka oczywistych obejścia:

  • Kapsułkować wszystko w cudzysłów.
  • Pozwól, aby wszystko było nazywane małymi literami.

Ale zastanawiam się dlaczego. Biorąc pod uwagę, jak wiele kontrowersji wyobrażam sobie, że ta decyzja projektowa powoduje, jestem zaskoczony, że nie mogłem znaleźć żadnej racji w Internecie. Czy ktokolwiek ma dokładne wyjaśnienie, a najlepiej link do jakiegoś manifestu programisty, dlaczego Postgres został zaprojektowany w ten sposób? Jestem zainteresowany.

+0

Pytasz o to? http://stackoverflow.com/questions/153944/is-sql-syntax-case-sensitive?rq=1 –

+3

AFAIK, standard mówi, że niecytowane identyfikatory powinny być składane na duże litery, [fałdy PostgreSQL na małe litery] (http : //stackoverflow.com/a/8736088/479863) zamiast tego. Składanie na duże lub małe litery nie powinno mieć znaczenia, chyba że podajesz tylko identyfikatory, ale jeśli to robisz, zasługujesz na to, co dostajesz. Możesz utworzyć "Naleśniki (...)" i "wybierz * z naleśników", po prostu nie "stwórz" Naleśników "(...)" i spróbuj "wybrać * z naleśników". Ludzie MySQL wydają się mieć ten dziwny nawyk rzucania zwrotów - cytowanie wszystkiego, utratę tego nawyku. –

+0

@muistooshort Zauważyłem generalnie, że specyfikacja SQL nie określa, czy wielkość liter w fałdach ma być duża czy mała, tylko że musi wystąpić. Czy wiesz, gdzie konkretnie ma się składać na duże litery? (Szukam referencji, ale nie znajduję zbyt wielu przydatnych informacji). –

Odpowiedz

6

Standard SQL określa folding niecytowane identyfikatory na duże litery. Wiele innych RDBMS podąża za tym standardem w ten sposób. Firebird i Oracle to robią. Oznacza to, że dopasowanie identyfikatorów domyślnie jest niewrażliwe na wielkość liter. To zachowanie jest bardzo ważne, jeśli chodzi o zgodność w podstawowych zapytaniach. Pod tym względem zachowanie MySQL jest prawdziwym odstępstwem.

PostgreSQL jednak różni się od standardowego przez zagięcie na małe. Istnieją ogólne powody, dla których jest to uważane za bardziej czytelne, itp., Ponieważ można używać argumentów dla składni cingowania. Coś jak:

SELECT foo FROM bar WHERE baz = 1; 

Jest to bardziej naturalne, gdy sprawy są składane na niższe. Alternatywą składania przeciwnie będzie:

select FOO from BAR where BAZ = 1; 

Ogólnie jak poprzednie zachowanie (składane do małych liter) becasue podkreśla SQL operacji lepiej podczas składania w innym przypadku DE-podkreśla operacji i podkreśla identyfikatorów. Biorąc pod uwagę złożoność wielu pytań, myślę, że ten pierwszy działa lepiej.

Ogólnie rzecz biorąc, najwięcej dyskusji, które widziałem na listach mailingowych postgres, polegało na tym, że wszyscy zgadzają się, że normalne zachowanie jest zepsute. więc powyższe jest moje zrozumienie problemów.

+0

Nie rozumiem kontekstu linii "Pod tym względem zachowanie MySQL jest prawdziwym odstępstwem". Czy chodziło Ci o "Postgres" zamiast "MySQL"? Czy jest tu jakiś inny kontekst dla "MySQL", który przeoczyłem? –

+0

Odsyłacz do gier MySQL i wątków PostgreSQL. –

Powiązane problemy