2012-11-16 3 views
5

J'essaie de me familiariser avec Postgres (9.2) après un peu d'utilisation de MySQL (5.1), depuis que j'ai été mordu par une poignée de MySQL's gotchas. Cependant, dans mes cinq premières minutes avec Postgres je suis tombé sur l'un des its gotchas, que je suis sûr que tout le monde succès:Pourquoi PostgreSQL par défaut tout en minuscules?

  • Par défaut, PostgreSQL convertit tout ce qui n'est pas cité en minuscules.

Ce n'est pas trop grand d'un problème pour moi, car il y a deux solutions de contournement évidentes:

  • Encapsulate tout entre guillemets.
  • Autoriser que tout soit nommé en minuscules.

Mais je me demande pourquoi. Compte tenu de la controverse que j'imagine cette décision de conception provoque, je suis surpris que je ne pouvais pas trouver de justification sur internet. Quelqu'un at-il une explication complète, ou de préférence un lien vers un manifeste de développeur, pour savoir pourquoi Postgres a été conçu de cette façon? Je suis intéressé.

+0

Demandez-vous à ce sujet? http://stackoverflow.com/questions/153944/is-sql-syntax-case-sensitive?rq=1 –

+3

AFAIK, la norme dit que les identificateurs sans guillemets doivent être repliés en majuscules, [PostgreSQL se couche en minuscules] (http : //stackoverflow.com/a/8736088/479863) à la place. Se replier en majuscules ou en minuscules ne devrait pas avoir d'importance à moins que vous n'inscriviez parfois que vos identifiants, mais si vous le faites, vous méritez ce que vous obtenez. Vous êtes invités à 'créer des Pancakes de table (...)' et 'select * from Pancakes', mais ne créez pas de" Pancakes de table "(...)' et essayez de 'sélectionner * from Pancakes'. Les gens de MySQL semblent avoir cette habitude bizarre de faire des backtick - en citant tout, perdre cette habitude. –

+0

@muistooshort J'ai généralement vu des revendications que la spécification SQL ne spécifie pas si le cas-pliage doit être majuscule ou minuscule, seulement que cela doit se produire. Savez-vous où il est spécifié de plier en majuscules spécifiquement? (Je cherche des références mais je ne trouve pas beaucoup de choses utiles pour le moment). –

Répondre

6

La norme SQL spécifie le repliement des identificateurs sans guillemets en majuscules. Beaucoup d'autres SGBDR suivent la norme de cette manière. Firebird et Oracle le font tous les deux. Cela signifie que la correspondance d'identificateur est, par défaut, insensible à la casse. Ce comportement est très important lorsqu'il s'agit de compatibilité dans les requêtes de base. À cet égard, le comportement de MySQL est une véritable aberration.

Cependant, PostgreSQL s'écarte de la norme en se repliant en minuscule. Il y a des raisons générales pourquoi ceci est considéré plus lisible, etc. parce que vous pouvez employer l'affaire pour la syntaxe de citation. Quelque chose comme:

SELECT foo FROM bar WHERE baz = 1; 

Ceci est plus naturel lorsque les cas sont pliés à abaisser. Le contraire de pliage alternative serait:

select FOO from BAR where BAZ = 1; 

En général, comme l'ancien comportement (pliage en minuscules) becasue il met l'accent sur les opérations sql mieux en pliant à l'autre cas de-met l'accent sur les opérations et met l'accent sur les identifiants. Compte tenu de la complexité de nombreuses requêtes, je pense que le premier fonctionne mieux.

En général, la plus grande discussion que j'ai vu sur les listes de diffusion postgres a été que tout le monde est d'accord que le comportement standard-mandaté est cassé. donc ce qui précède est ma compréhension des problèmes.

+0

Je ne comprends pas le contexte de la ligne "A cet égard, le comportement de MySQL est une vraie aberration". Voulez-vous dire 'Postgres' au lieu de 'MySQL'? Ou est-ce qu'il y a un autre contexte pour 'MySQL' que j'ai raté? –

+0

Référence aux pièges de MySQL et aux pièges de PostgreSQL. –

Questions connexes