Odpowiedź brzmi nie .
Nie dodawaj modyfikatora długości, varchar
jeśli możesz tego uniknąć. W większości przypadków tak naprawdę nie potrzebujesz ograniczenia długości. Po prostu użyj text
dla wszystkich danych postaci. Zrób to varchar
(bez modyfikatora długości), jeśli chcesz zachować zgodność z RDBMS, który nie ma text
.
Wydajność jest prawie taka sama - w rzadkich sytuacjachtext
jest nieco szybsza , a cykle zapisujesz na sprawdzenie długości.
Jeśli faktycznie potrzebujesz wymusić maksymalną długość, nadal używaj text
i dodaj ograniczenie sprawdzania :
ALTER TABLE tbl ADD CONSTRAINT tbl_col_len CHECK (length(col) < 51);
Możesz zmodyfikować lub usunąć takie ograniczenie w dowolnym momencie, bez konieczności wprowadzania zmian w definicji tabeli i wszystkich zależnych obiektach (widoki, funkcje, klucze obce, ...)
Dzięki modyfikatorom długości po prostu napotykasz problemy takie jak ta czy ta czy ta ...
PostgreSQL 9.1 wprowadził nową funkcję, która nieco łagodzi ból. Przytaczam tutaj informacje o wydaniu :
Pozwól ALTER TABLE ... SET DATA TYPE
uniknąć przepisywania tabel w odpowiednich przypadkach (Noah Misch, Robert Haas)
Na przykład konwersja varchar
kolumny na tekst nie wymaga już przepisania tabeli. Jednak zwiększenie ograniczenia długości
varchar
kolumny nadal wymaga przepisania tabeli.
Erwin Brandstetter
źródło
varchar(n)
końcu dla uproszczenia - jeśli wady zwykle nie wpływają na ciebie. (Limit nie jest w twoim przypadku arbitralny, jeśli chcesz egzekwować faktyczną maksymalną długość.)Jeśli widzisz limit długości jako rodzaj ograniczenia sprawdzania, aby upewnić się, że sprawdzasz poprawność danych, to tak, dodaj go. Właściwie możesz nie używać określenia długości, lecz realne ograniczenia wyboru zamiast tego dokonać zmieniając limit szybciej.
Aby zmienić (zwiększyć) limit długości, musisz uruchomić taki,
ALTER TABLE
który może zająć dużo czasu (ze względu na możliwe ponowne zapisanie tabeli), podczas którego konieczna jest wyłączna blokada stołu.Zmiana (tj. Upuszczenie i ponowne utworzenie) ograniczenia sprawdzania jest bardzo krótką operacją i wymaga jedynie odczytu danych tabeli, nie zmieni żadnych wierszy. Będzie to o wiele szybsze (co z kolei oznacza, że wyłączna blokada stołu będzie utrzymywana przez znacznie krótszy czas).
Podczas pracy nie ma żadnej różnicy między a
text
, avarchar
lubvarchar(5000)
kolumną.źródło
Pytanie dotyczy w szczególności tego, czy dodanie dowolnego limitu długości do kolumn VARCHAR?
Na to odpowiedź brzmi „nie”. Nic nie usprawiedliwia dodania arbitralnego limitu, tak jak w gorszych bazach danych, które obsługują
varchar(max)
lub używają takich konwencjivarchar(255)
. Jeśli jednak specyfikacja dotyczy limitu, myślę, że odpowiedź staje się znacznie bardziej złożona, szczególnie w przypadku nowoczesnych wersji PostgreSQL. I do tego skłaniałbym się ku TAK .Moim zdaniem limit jest rozsądnym wyborem, jeśli wymaga tego specyfikacja. Zwłaszcza w przypadku bardziej rozsądnych obciążeń. Jeśli nie z innego powodu, to w celu zachowania metadanych.
Z mojej odpowiedzi tutaj, wydajność indeksu dla CHAR vs VARCHAR (Postgres) , gdzie odnoszę się do wartości metadanych.
źródło
Wygląda na to, że może występować pewna różnica w wydajności, jeśli
VARCHAR
jest regularnie używana do przechowywania bardzo dużych ciągów, ponieważ „długie ciągi są automatycznie kompresowane przez system”, a „bardzo długie wartości są również przechowywane w tabelach w tle”. Teoretycznie oznaczałoby to, że duża liczba żądań dla bardzo długiego pola łańcuchowego byłaby wolniejsza niż dla pola krótkiego łańcucha. Prawdopodobnie nigdy nie napotkasz tego problemu, ponieważ nazwy i adresy nie będą bardzo długie.Jednak w zależności od tego, jak używasz tych ciągów poza bazą danych, możesz chcieć dodać praktyczny limit, aby zapobiec nadużyciom systemu. Na przykład, jeśli gdzieś wyświetlasz nazwę i adres w formularzu, możesz nie być w stanie wyświetlić całego akapitu tekstu w polu „nazwa”, więc sensowne byłoby ograniczenie kolumny nazwy do około 500 postacie.
źródło
VARCHAR
jest czysto syntaktycznym cukrem, ponieważTEXT
w Postgres nie ma różnicy w przechowywaniu; kompresja w porównaniu z pamięcią tabeli w tle jest wykonywana na podstawie faktycznej długości danych w kolumnie, a nie na metadanych kolumny. Kolumny TEXT są przechowywane wewnętrznie jakovarlena
struktura C (która jest tablicą o zmiennej długości z pierwszymi 4 bajtami przechowującymi długość przy tworzeniu / aktualizacji) i ta struktura jest zoptymalizowana na podstawie jej długości.