Zgadzam się ze wszystkim , co powiedział a_horse_with_no_name, i ogólnie zgadzam się z poradą Erwina na komentarz:
Nie, char jest gorszy (i nieaktualny). tekst i varchar działają (prawie) tak samo.
Metadane
Z jednym drobnym wyjątkiem używam tylko wtedy, char()
gdy chcę, aby metadane mówiły, że MUSI mieć znaki x. Chociaż wiem, że char()
narzeka tylko wtedy, gdy wkład przekroczy limit, często zabezpieczam się przed niedopełnieniem w CHECK
ograniczeniu. Na przykład,
CREATE TABLE foo (
x char(10) CHECK ( length(x) = 10 )
);
INSERT INTO foo VALUES (repeat('x', 9));
Robię to z kilku powodów,
char(x)
jest czasami wywnioskowany z ładujących schematy jako kolumna o stałej szerokości. Może to mieć znaczenie w języku zoptymalizowanym dla ciągów o stałej szerokości.
- Ustanawia konwencję, która ma sens i jest łatwa do egzekwowania. Potrafię napisać moduł ładujący schematy w języku, aby wygenerować kod z tej konwencji.
Potrzebujesz przykładu, gdzie mogę to zrobić,
- Dwuliterowe skróty stanu, chociaż ponieważ tę listę można wyliczyć, zwykle zrobię to za pomocą
ENUM
.
- Numery identyfikacyjne pojazdu
- Numery modeli (o stałym rozmiarze)
O błędach
Zauważ, że niektórzy ludzie mogą czuć się niekomfortowo z niezgodnością komunikatów o błędach po obu stronach limitu, ale nie przeszkadza mi to
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)
Kontrastować z varchar
Co więcej, myślę, że powyższa sugestia bardzo dobrze pasuje do konwencji prawie zawsze używanejtext
. Ty też pytasz varchar(n)
. Nigdy tego nie używam . Przynajmniej nie pamiętam, kiedy ostatni raz użyłem varchar(n)
.
- Jeśli specyfikacja ma zaufane pole o statycznej szerokości, używam
char(n)
,
- W przeciwnym razie używam,
text
co jest efektywne varchar
(bez limitu)
Gdybym znalazł specyfikację z kluczami tekstowymi o zmiennej długości, które były znaczące i że ufałem, że będę mieć stałą maksymalną długość, też bym użył varchar(n)
. Nie mogę jednak wymyślić niczego, co spełniałoby te kryteria.
Dodatkowe uwagi
Powiązane pytania i odpowiedzi: