Czy jest jakiś powód, aby używać varchar zamiast kolumn tekstowych w bazie danych?

36

Jest varchartylko pozostałością sprzed textpodjechał lub istnieją przypadki, w których używać będziesz chcą , aby użyć varchar? (Lub charo to chodzi ..)

(Używam codziennie Postgres i MySQL (MyISAM), więc najbardziej mnie to interesuje, ale odpowiedzi na inne bazy danych są oczywiście mile widziane. ^ _-)

Izkata
źródło
6
Przynajmniej dla SQL Server , textjest przestarzała. Istnieją również względy użytkowania związane z miejscem przechowywania danych i sposobem ich uzyskania.
Oded,
W niektórych DBMS może nie być możliwe użycie kolumny tekstowej w klauzuli sortowania lub where. Nie znam Postgres, ale sprawdź swoją dokumentację.
jqa
1
To pytanie StackOverflow może dostarczyć więcej informacji.
J0ANMM,

Odpowiedzi:

32

Ogólnie

textkolumny są niestandardowe i specyficzne dla implementacji. W wielu przypadkach, w zależności od bazy danych, mogą mieć kombinację jednego lub więcej z następujących ograniczeń: nie można indeksować , nie można przeszukiwać i nie można sortować .

W Postgres

Wszystkie te typy są wewnętrznie zapisywane przy użyciu tej samej struktury danych C. .

W MySQL

textKolumna jest wyspecjalizowanym wersjaBLOB i ma ograniczeń dotyczących indeksowania.

Tylko te dwa przykłady można ekstrapolować na inne systemy SQL RDBMS i powinny być wystarczającym powodem, aby zrozumieć, kiedy wybrać jeden z typów.

Aby wyjaśnić to w sposób dorozumiany, nigdy nie należy używać, TEXTponieważ jest zastrzeżony i niestandardowy. Wszelkie SQLpisma przeciwko nie będą przenośne i na pewno spowodują problemy w przyszłości. Używaj tylko typów, które są częścią standardu ANSI .

  • Użyj, CHARjeśli wiesz, że masz stałą liczbę znaków dla każdego wpisu.
  • Użyj, VARCHARgdy masz zmienną liczbę znaków dla każdego wpisu.
  • Jeśli potrzebujesz więcej miejsca niż VARCHARjest w stanie zapewnić, CLOBz UTF-8kodowaniem lub równoważnym typem standardowym.
  • NIGDY nie należy używać, TEXTponieważ jest to niestandardowe.

źródło
1
Zaakceptowano non standard and implementation specifici not indexable, not searchable and not sortableczego nie zdawałem sobie sprawy. Byłem pod wrażeniem, że text został ustandaryzowany.
Izkata
1
masz na myśli textstandard ASCII lub standard UNICODE text:-) czy jeden z pozostałych pół tuzina textstandardów kodowania?
1
jeśli przejrzysz dokumenty standardu SQL, nie sądzę, że znajdziesz coś textw rodzaju postaci. Nic nie widziałem, niektórzy dostawcy nazywają to long chari tym podobne, jest to po prostu BLOB z dołączonym kodowaniem.
2
@JarrodRoberson szczerze mówiąc, istnieje wiele renomowanych zasobów, z których wynika (w środowisku Postgres), że „zawsze używają TEXT”. Jeśli zamierzasz przeprowadzić migrację do innej bazy danych, nie jest to przełomem, zwłaszcza że musisz wziąć pod uwagę, że postgres jest nieograniczony VARCHAR(ze względu na TOAST nie ma limitu wierszy, jak na przykład w MySQL) może nie tłumaczyć się na nieograniczony VARCHARw w każdym razie inne bazy danych.
Kayaman
1
... a ponieważ Postgres nie obsługuje CLOB , od drugiego do ostatniego punktu nie ma miejsca. Nigdy nie będziesz w stanie obsługiwać zastępczych wymian, nawet jeśli będziesz przestrzegać standardu. Podobnie jak pisanie ANSI SQL nie jest realną opcją w prawdziwym świecie, chyba że piszesz zabawkowy SQL.
Kayaman
11

text, varcharI charsą używane do różnych powodów. Istnieją oczywiście różnice w implementacji (jak duży rozmiar zajmują ... itd.), Ale są też względy użytkowania i intencji . Jakiego typu używasz, mówi ci też coś o rodzaju danych, które będą w nim przechowywane (lub wszyscy byśmy wykorzystali textdo wszystkiego ). Jeśli coś ma określoną długość, używamy char. Jeśli ma zmienną długość z dobrze określoną górną granicą, użyj varchar. Jeśli jest to duży fragment tekstu, nad którym nie masz kontroli text, prawdopodobnie byłbyś najlepszym wyborem.

System wyłączony
źródło
3
Ooooooo, jedyną prawdziwą różnicą jest zduplikowanie sprawdzania granic, które prawdopodobnie powinno być w kodzie programu?
Izkata,
2
@Izkata - Istnieją również różnice w implementacji. Nie chodzi o sprawdzanie granic, chodzi o typ danych . Kod pocztowy (US) jest zawsze 5-cyfrowym kodem, więc użycie czegoś takiego jak „char” staje się częścią definicji tego fragmentu danych. Gdyby chodziło tylko o sprawdzanie granic, wszyscy moglibyśmy po prostu użyć jednego typu danych do wszystkiego i wykonać naszą stronę sprawdzania i rzutowania kodu.
System Down
6
@SystemDown O ile wiem char, varchari textsą przeznaczone do magazynowania ten sam typ danych. Tak więc obie odpowiedzi dotyczą sprawdzania granic. Jeśli występują różnice w wydajności, czym one są? Dlaczego miałbym używać varcharwięcej text?
Izkata,
1
zmiennoprzecinkowe i podwójne są również używane dla tego samego typu danych, ale różnią się między sobą i są używane w inny sposób. Jeśli chodzi o różnice w implementacji, nie znam wystarczająco dużo Postgres, aby odpowiedzieć, że się boję.
System Down
4
@SystemDown Chociaż przechowywanie kodów pocztowych jako znak (5) może cię ugryźć, jeśli zaczniesz internacjonalizację. Kody pocztowe w Wielkiej Brytanii różnią się długością, a 5 znaków prawie nigdy nie wystarcza. Nie wiem jednak, czy spacja w brytyjskim kodzie pocztowym jest istotna dla parsowania.
Vatine
5

Bazy danych są głęboko zainteresowane wydajnością - szybkością i minimalizacją pamięci. W większości innych części świata komputerowego nie będziesz się przejmować liczbą znaków w ciągu znaków; może być jeden, może to być cała zawartość encyklopedii; wszystko to tylko struna. W rzeczywistości wiele języków nawet nie przejmuje się tym, czy jest to ciąg, czy liczba.

Ale gdy komputery stają się szybsze i zyskują więcej pamięci, ludzie umieszczają więcej danych w swoich bazach danych i wykonują bardziej wyszukane zapytania. W przypadku bazy danych procesor i pamięć są dziś tak samo ograniczające, jak w czasach pamięci głównej 64 KB i dysków twardych 10 Mb (na komputerach mainframe ).

Ustalona liczba bajtów jest znacznie łatwiejsza w obsłudze niż liczba o zmiennej długości. Z 10 bajtami łatwiej jest sobie poradzić niż 1 000 000. Tak więc twoja baza danych chce, abyś dał jej wskazówkę, aby mogła dostarczyć gigabajt wyników z terrabajtów danych w mikrosekundach. Jeśli nie używasz bazy danych tak mocno, nie będziesz potrzebować szybkości, jaką ona oferuje, i będziesz zirytowany niepotrzebnymi pytaniami. Ale jeśli potrzebujesz wydajności, z przyjemnością udzielisz wskazówek.

Jak zauważono w innych odpowiedziach, użyj, charjeśli zawsze używa określonej liczby znaków, varcharjeśli długość może się różnić, ale nie staje się zbyt duża ( domyślam się, że większość DB traktuje to jako charlub w textzależności od rozmiaru), i textjeśli może być dowolnej długości. Jeśli Twój SQL próbuje użyć textkolumny, najlepiej może ją jakoś podsumować i umieścić w charmałej lub małej varcharkolumnie, a następnie zrób whereto i order byna tym. Oczywiście tylko wtedy, gdy liczy się wydajność.

RalphChapin
źródło