Je suis d'accord avec tout ce que dit a_horse_with_no_name, et je suis généralement d'accord avec les commentaires d'Erwin:
Non, l'omble est inférieur (et obsolète). text et varchar font (presque) la même chose.
Métadonnées
À une exception près, la seule fois que j'utilise, char()
c'est quand je veux que les métadonnées disent que cela DOIT avoir des caractères x. Bien que je sache que cela char()
ne se plaint que si l'entrée dépasse la limite, je vais souvent me protéger contre les sous-exécutions dans une CHECK
contrainte. Par exemple,
CREATE TABLE foo (
x char(10) CHECK ( length(x) = 10 )
);
INSERT INTO foo VALUES (repeat('x', 9));
Je le fais pour plusieurs raisons,
char(x)
est parfois déduit avec les chargeurs de schéma comme étant une colonne de largeur fixe. Cela peut faire la différence dans un langage optimisé pour les chaînes de largeur fixe.
- Il établit une convention qui a du sens et est facilement appliquée. Je peux écrire un chargeur de schéma dans un langage pour générer du code à partir de cette convention.
Besoin d'un exemple de l'endroit où je peux le faire,
- Abréviations d'état à deux lettres, mais comme cette liste peut être énumérée, je le fais généralement avec un
ENUM
.
- Numéros d'identification du véhicule
- Numéros de modèle (de taille fixe)
Sur les erreurs
Notez que certaines personnes peuvent être mal à l'aise avec l'incongruité des messages d'erreur des deux côtés de la limite, mais cela ne me dérange pas
test=# INSERT INTO foo VALUES (repeat('x', 9));
ERROR: new row for relation "foo" violates check constraint "foo_x_check"
DETAIL: Failing row contains (xxxxxxxxx ).
test=# INSERT INTO foo VALUES (repeat('x', 11));
ERROR: value too long for type character(10)
Contraste avec varchar
De plus, je pense que la suggestion ci-dessus correspond très bien à une convention d' utilisation presque toujourstext
. Vous demandez varchar(n)
aussi. Je n'utilise jamais ça . Au moins, je ne me souviens pas de la dernière fois que j'ai utilisé varchar(n)
.
- Si une spécification a un champ de largeur statique auquel je fais confiance, j'utilise
char(n)
,
- Sinon, j'utilise
text
ce qui est effectivement varchar
(pas de limite)
Si je trouvais une spécification qui avait des touches de texte de longueur variable qui étaient significatives et que je faisais confiance pour avoir une longueur maximale constante, j'utiliserais varchar(n)
aussi. Cependant, je ne vois rien qui corresponde à ces critères.
Notes complémentaires
Questions et réponses connexes: