Sono d'accordo con tutto quanto detto da a_horse_with_no_name e generalmente sono d'accordo con il consiglio di commento di Erwin:
No, char è inferiore (e obsoleto). text e varchar si comportano (quasi) allo stesso modo.
Metadati
Con una piccola eccezione, l' unica volta che uso char()
è quando voglio che i metadati diano che DEVE avere caratteri x. Anche se so che mi char()
lamento solo se l'input supera il limite, spesso proteggerò dai sottotitoli in un CHECK
vincolo. Per esempio,
CREATE TABLE foo (
x char(10) CHECK ( length(x) = 10 )
);
INSERT INTO foo VALUES (repeat('x', 9));
Lo faccio per alcuni motivi,
char(x)
viene talvolta dedotto con i caricatori di schemi come una colonna a larghezza fissa. Ciò può fare la differenza in una lingua ottimizzata per stringhe a larghezza fissa.
- Stabilisce una convenzione che ha senso ed è facilmente applicabile. Posso scrivere un caricatore di schemi in una lingua per generare codice da questa convenzione.
Ho bisogno di un esempio di dove posso farlo,
- Abbreviazioni di stato a due lettere, sebbene poiché questo elenco può essere elencato, lo farò in genere con un
ENUM
.
- Numeri di identificazione del veicolo
- Numeri di modello (di dimensioni fisse)
Sugli errori
Si noti che alcune persone potrebbero essere a disagio con l'incongruenza dei messaggi di errore su entrambi i lati del limite, ma non mi dà fastidio
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)
In contrasto con varchar
Inoltre, penso che il suggerimento di cui sopra si adatti molto bene a una convenzione di uso quasi sempretext
. Chiedi varchar(n)
anche tu . Non lo uso mai . Almeno, non ricordo l'ultima volta che ho usato varchar(n)
.
- Se una specifica ha un campo a larghezza statica di cui mi fido, utilizzo
char(n)
,
- Altrimenti, uso quello
text
che è effettivamente varchar
(nessun limite)
Se trovassi una specifica che avesse chiavi di testo a lunghezza variabile che fossero significative e che mi fossi fidato di avere una lunghezza massima costante, lo avrei usato varchar(n)
anch'io. Tuttavia, non riesco a pensare a nulla che soddisfi questi criteri.
Note aggiuntive
Domande e risposte correlate: