Dlaczego nadal istnieje typ danych varchar?

36

Wiele moich baz danych ma pola zdefiniowane jako varchars. Nie stanowiło to większego problemu, ponieważ mieszkam i pracuję w Ameryce (gdzie jedynym istniejącym językiem jest „amerykański”. Ahem )

Po około 5 latach pracy z bazami danych odkryłem, że w końcu mam problemy z ograniczoną naturą pola varchar i muszę zmodyfikować moje pola, aby przechowywać dane jako nvarchars. Po tym, jak musiałem dokonać kolejnej aktualizacji tabeli i przekonwertować pole varchar na nvarchar, pomyślałem sobie: dlaczego nadal robimy to w ten sposób? Już dawno podjąłem decyzję, by zdefiniować wszystkie nowe pola tekstowe w nvarchar zamiast w varchar, czego nauczyłem się z podręczników, gdy byłem w szkole 10 lat temu.

Jest rok 2011, aw zeszłym roku pojawiła się nowa wersja SQL Server. Dlaczego nadal obsługujemy typ danych varchar, skoro możemy / powinniśmy zamiast tego używać nvarchar?

Wiem, że często argumentuje się, że nvarchars są „dwa razy większe” niż varchary, więc użycie przestrzeni dyskowej może być jednym argumentem dla konserwujących varcars.

Jednak dzisiejsi użytkownicy mogą zdefiniować swoich nvarchars do przechowywania danych jako UTF-8 zamiast domyślnego UTF-16, jeśli chcą zaoszczędzić miejsce. Pozwoliłoby to na kodowanie 8-bitowe, jeśli jest to przede wszystkim pożądane, przy jednoczesnym zapewnieniu, że rzadki 2-8-bajtowy znak wstawiany do ich bazy danych niczego nie złamie.

Czy coś brakuje? Czy istnieje dobry powód, dla którego nie zmieniło się to w ciągu ostatnich 15-20 lat?

RLH
źródło

Odpowiedzi:

37
  1. praca w varchar jest wystarczająca dla wielu języków zachodnioeuropejskich (norweski, duński, niemiecki, francuski, holenderski itp.) z zastrzeżeniem pewnych problemów z sortowaniem

  2. Zobacz to na SO varchar vs. nvarchar wydajność nvarchar ma poważne konsekwencje dla wydajności

  3. Jest to trywialne w porównaniu z datami MDY vs. DMY

gbn
źródło
23

Oprócz odpowiedzi dotyczących standardów i zgodności należy również pamiętać o wydajności. Podczas gdy miejsce na dysku jest łatwo akceptowane jako tanie, DBA / programiści często ignorują fakt, że wydajność zapytań jest czasami bezpośrednio związana z rozmiarem wiersza / strony tabeli. Użycie NVARCHARzamiast VARCHAR(gdy jest to niepotrzebne) skutecznie podwoi rozmiar wiersza dla pól postaci. Jeśli masz, powiedzmy, 5 lub 10 pól o długości 50, mówisz o potencjalnym dodaniu dodatkowych 500 bajtów na wiersz. Jeśli masz szeroki stół, może to wypchnąć każdy wiersz na wiele stron i mieć negatywny wpływ na wydajność.

Derek Kromm
źródło
17

Wiele organizacji wciąż ma dużą bazę zainstalowanych aplikacji, interfejsów, platform i narzędzi, które przyjmują znaki jednobajtowe. Bazy danych rzadko żyją w izolacji - stanowią część ekosystemu IT. Jeśli masz tysiące komponentów i miliony wierszy kodu zależnych od znaków jednobajtowych, potrzebujesz dobrego powodu, aby zainwestować czas i pieniądze potrzebne do przejścia na Unicode. Wprowadzenie zmian na taką skalę może zająć lata. W niektórych miejscach Unicode jest wciąż stosunkowo nowy, rzadki lub nie w pełni obsługiwany.

Zarówno VARCHAR, jak i NVARCHAR są częścią SQL Standard ISO. Usunięcie lub wycofanie obsługi VARCHAR w SQL Server byłoby krokiem wstecz w kompatybilności i przenośności.

nvogel
źródło
16

Alternatywnie, dzisiejsi użytkownicy mogą zdefiniować swoich nvarchars do przechowywania danych jako UTF-8 zamiast domyślnego UTF-16, jeśli chcą zaoszczędzić na przestrzeni dyskowej.

To właśnie robi większość baz danych typu open source VARCHAR.

  • MySQL zapewnia utf8i ucs2„zestawienia”.
  • SQLite daje wybór pomiędzy UTF-8 (domyślnie) a UTF-16.
  • PostgreSQL obsługuje UTF-8 (ale nie UTF-16).

Nie trzeba mieć dwóch osobnych typów ciągów.

Microsoft jest dziwny, ponieważ jego zdaniem 8-bitowe ciągi znaków są przeznaczone dla starszych kodowań i Unicode = UTF-16. Co jest prawdopodobnie związane z traktowaniem samego interfejsu API systemu Windows chari wchar_ttym sposobem.

dan04
źródło
15

Ponieważ niektórzy z nas budują lżejsze, mniejsze aplikacje na mniej niż najnowocześniejszym sprzęcie, które nie potrzebują funkcji Unicode. Być może będziemy musieli to zmienić później, ale na razie po prostu tego nie potrzebujemy. Lubię moje ciągi zajmujące 1/2 miejsca, które w przeciwnym razie musiałyby być pod NVARCHAR.

Jason
źródło