Nie ma różnicy, pod maską jest wszystko varlena
( tablica o zmiennej długości ).
Sprawdź ten artykuł z Depesz: http://www.depesz.com/index.php/2010/03/02/charx-vs-varcharx-vs-varchar-vs-text/
Kilka najważniejszych:
Podsumowując:
- char (n) - zajmuje zbyt dużo miejsca w przypadku wartości krótszych niż
n
( n
uzupełnia je ) i może prowadzić do subtelnych błędów z powodu dodania spacji końcowych, a także zmiana granicy jest problematyczna
- varchar (n) - problematyczne jest zmienianie limitu w środowisku na żywo (wymaga wyłącznej blokady podczas zmiany tabeli)
- varchar - tak jak tekst
- tekst - dla mnie zwycięzca - ponad (n) typami danych, ponieważ brakuje im ich problemów, a ponad varchar - ponieważ ma odrębną nazwę
W artykule przeprowadzono szczegółowe testy, aby wykazać, że wydajność wstawiania i selekcji dla wszystkich 4 typów danych jest podobna. Szczegółowo przygląda się również alternatywnym sposobom ograniczania długości w razie potrzeby. Wiązania lub domeny oparte na funkcjach mają tę zaletę, że natychmiastowe zwiększenie ograniczenia długości, a na podstawie tego, że zmniejszenie ograniczenia długości łańcucha jest rzadkie, depesz stwierdza, że jeden z nich jest zwykle najlepszym wyborem dla ograniczenia długości.
Jako „ zestaw znaków ” w punktach dokumentacja określająca,
varchar(n)
,char(n)
, itext
są przechowywane w ten sam sposób. Jedyna różnica polega na tym, że potrzebne są dodatkowe cykle, aby sprawdzić długość, jeśli jest podana, oraz dodatkowa przestrzeń i czas wymagany, jeśli konieczne jest wypełnieniechar(n)
.Jednak gdy potrzebujesz zapisać tylko jeden znak, użycie specjalnego typu ma niewielką przewagę wydajności
"char"
(zachowaj podwójne cudzysłowy - są one częścią nazwy typu). Uzyskujesz szybszy dostęp do pola i nie ma narzutu do przechowywania długości.Właśnie stworzyłem tabelę z losową liczbą 1 000 000
"char"
wybraną z małego alfabetu. Zapytanie w celu uzyskania rozkładu częstotliwości (select count(*), field ... group by field
) zajmuje około 650 milisekund, w porównaniu z około 760 dla tych samych danych przy użyciutext
pola.źródło
"char"
nie jestchar
?? Jest aktualny w PostgreSQL 11+? ... Tak: „Typ"char"
(zwróć uwagę na cudzysłów) różni się od char (1) tym, że wykorzystuje tylko jeden bajt pamięci. Jest używany wewnętrznie w katalogach systemowych jako uproszczony typ wyliczenia ”. , przewodnik / znak typu danych .AKTUALIZACJA PORÓWNAWCZYCH NA 2016 R. (str.5.5 +)
I przy użyciu testów porównawczych „czystego SQL” (bez zewnętrznego skryptu)
użyj dowolnego string_generatora z UTF8
główne punkty odniesienia:
2.1 WSTAWIĆ
2.2 WYBIERZ porównywanie i liczenie
Przygotuj konkretny test (przykłady)
Wykonaj podstawowy test:
I inne testy,
... i użyj
EXPLAIN ANALYZE
.AKTUALIZACJA PONOWNIE 2018 (str.10)
mała edycja, aby dodać wyniki z 2018 roku i wzmocnić rekomendacje.
Wyniki w 2016 i 2018 r
Moje wyniki, po uśrednieniu, na wielu maszynach i wielu testach: wszystkie takie same
(statystycznie mniejsze odchylenie standardowe).
Rekomendacje
Użyj
text
typu danych,unikaj starych,
varchar(x)
ponieważ czasami nie jest to standard, np. WCREATE FUNCTION
klauzulachvarchar(x)
≠varchar(y)
.wyraźne limity (z tą samą
varchar
wydajnością!) za pomocąCHECK
klauzuliCREATE TABLE
np
CHECK(char_length(x)<=10)
.Przy nieznacznej utracie wydajności w INSERT / UPDATE można także kontrolować zakresy i strukturę łańcuchów,
np
CHECK(char_length(x)>5 AND char_length(x)<=20 AND x LIKE 'Hello%')
źródło
"char"
, który nie jest dostępnychar
, nawet w dzisiejszych czasach PostgreSQL 11+. Jak mówi znak przewodnika / typu danych „Typ"char"
(zwróć uwagę na cudzysłów) różni się od char (1) tym, że wykorzystuje tylko jeden bajt pamięci. Jest używany wewnętrznie w katalogach systemowych jako uproszczony typ wyliczenia ”. .Na instrukcji PostgreSQL
Zwykle używam tekstu
Referencje: http://www.postgresql.org/docs/current/static/datatype-character.html
źródło
Moim zdaniem
varchar(n)
ma swoje zalety. Tak, wszystkie używają tego samego typu podstawowego i tak dalej. Należy jednak zauważyć, że indeksy w PostgreSQL mają limit wielkości 2712 bajtów na wiersz.TL; DR: Jeśli używasz
text
typ bez ograniczeń i mają indeksy na te kolumny, to jest bardzo prawdopodobne, że trafisz ten limit dla niektórych swoich kolumn i dostać błąd podczas próby wstawienia danych, ale z użyciemvarchar(n)
, można temu zapobiec.Kilka dodatkowych szczegółów: Problem polega na tym, że PostgreSQL nie podaje żadnych wyjątków podczas tworzenia indeksów dla
text
typu lubvarchar(n)
gdzien
jest większy niż 2712. Jednak da błąd, gdy spróbuje się wstawić rekord o skompresowanym rozmiarze większym niż 2712. Oznacza to, że możesz łatwo wstawić 100 000 znaków ciągu złożonego z powtarzalnych znaków, ponieważ będzie on skompresowany znacznie poniżej 2712 znaków, ale możesz nie być w stanie wstawić łańcucha zawierającego 4000 znaków, ponieważ rozmiar skompresowanego pliku jest większy niż 2712 bajtów. Używającvarchar(n)
gdzien
nie jest dużo większy niż 2712, jesteś bezpieczny przed tymi błędami.źródło
tekst i varchar mają różne niejawne konwersje typów. Największy wpływ, jaki zauważyłem, to obsługa spacji końcowych. Na przykład ...
zwraca,
true, false, true
a nietrue, true, true
jak można się spodziewać.źródło
Nieco OT: jeśli używasz Railsów, standardowe formatowanie stron internetowych może być inne. W przypadku formularzy do wprowadzania danych
text
pola można przewijać, ale polacharacter varying
(Szynystring
) są jednowierszowe. Pokaż widoki są tak długo, jak to konieczne.źródło
Dobre wyjaśnienie z http://www.sqlines.com/postgresql/datatypes/text :
źródło
character varying(n)
,varchar(n)
- (Oba te same). wartość zostanie obcięta do n znaków bez zgłaszania błędu.character(n)
,char(n)
- (Oba te same). o stałej długości i będzie podkładał puste miejsca do końca długości.text
- Nieograniczona długość.Przykład:
Otrzymujemy wyniki:
źródło