Czy to tylko nvarchar
obsługuje znaki wielobajtowe? Jeśli tak jest, to czy rzeczywiście jest coś innego niż problemy z przechowywaniem varchars
?
Czy to tylko nvarchar
obsługuje znaki wielobajtowe? Jeśli tak jest, to czy rzeczywiście jest coś innego niż problemy z przechowywaniem varchars
?
Odpowiedzi:
nvarchar
Kolumna może przechowywać żadnych danych Unicode. varchar
Kolumna jest ograniczony do 8-bitowych kodowej. Niektórzy uważają, że varchar
należy tego użyć, ponieważ zajmuje mniej miejsca. Uważam, że to nie jest poprawna odpowiedź. Niezgodności strony kodowej są uciążliwe, a Unicode jest lekarstwem na problemy ze stroną kodową. W dzisiejszych czasach przy niskim koszcie dysku i pamięci naprawdę nie ma powodu, aby marnować czas na przeszukiwanie stron kodowych.
Wszystkie nowoczesne systemy operacyjne i platformy programistyczne wykorzystują wewnętrznie Unicode. Używając nvarchar
zamiast varchar
, możesz uniknąć konwersji kodowania za każdym razem, gdy czytasz lub zapisujesz w bazie danych. Konwersje wymagają czasu i są podatne na błędy. Odzyskiwanie po błędach konwersji jest nietrywialnym problemem.
Jeśli łączysz się z aplikacją korzystającą tylko z ASCII, nadal zalecałbym użycie Unicode w bazie danych. Algorytmy sortowania systemu operacyjnego i bazy danych będą działać lepiej z Unicode. Unicode pozwala uniknąć problemów z konwersją podczas łączenia z innymi systemami. I będziesz się przygotowywał na przyszłość. I zawsze możesz potwierdzić, że Twoje dane są ograniczone do 7-bitowego ASCII dla dowolnego starszego systemu, który musisz utrzymywać, nawet korzystając z niektórych zalet pełnej pamięci Unicode.
varchar : Dane znakowe o zmiennej długości, inne niż Unicode. Zestawienie bazy danych określa, na której stronie kodowej przechowywane są dane.
nvarchar : Dane znakowe o zmiennej długości Unicode. W zależności od zestawienia bazy danych do porównań.
Uzbrojony w tę wiedzę, użyj dowolnego, który pasuje do twoich danych wejściowych (ASCII v. Unicode).
float
w produkt int
i odchodzą, „dobrze, czy dziesiętne iść brakuje.” Po prostu nie.
Zawsze używam nvarchar, ponieważ pozwala temu, co buduję, wytrzymać prawie wszystkie dane, które do niego rzucam. Mój system CMS robi przypadkowo chiński, ponieważ użyłem nvarchar. Obecnie żadne nowe aplikacje nie powinny tak naprawdę zajmować się wymaganą ilością miejsca.
"never"
, przynajmniej technicznie.
To zależy od sposobu zainstalowania Oracle. Podczas procesu instalacji ustawiona jest opcja NLS_CHARACTERSET. Możesz go znaleźć za pomocą zapytania SELECT value$ FROM sys.props$ WHERE name = 'NLS_CHARACTERSET'
.
Jeśli twój NLS_CHARACTERSET jest kodowaniem Unicode, takim jak UTF8, to świetnie. Korzystanie z VARCHAR i NVARCHAR jest prawie identyczne. Przestań czytać teraz, po prostu idź. W przeciwnym razie lub jeśli nie masz kontroli nad zestawem znaków Oracle, czytaj dalej.
VARCHAR - Dane są przechowywane w kodowaniu NLS_CHARACTERSET. Jeśli na tym samym serwerze znajdują się inne instancje bazy danych, mogą one być przez nich ograniczone; i vice versa, ponieważ musisz udostępnić ustawienie. W takim polu można przechowywać dowolne dane, które można zakodować przy użyciu tego zestawu znaków i nic więcej . Na przykład, jeśli zestaw znaków to MS-1252, możesz przechowywać tylko takie znaki, jak litery angielskie, garść liter akcentowanych i kilka innych (np. € i -). Twoja aplikacja przydałaby się tylko w kilku lokalizacjach, nie mogąc działać nigdzie indziej na świecie. Z tego powodu jest uważany za zły pomysł.
NVARCHAR - Dane są przechowywane w kodowaniu Unicode. Obsługiwany jest każdy język. Dobry pomysł.
Co z miejscem do przechowywania? VARCHAR jest ogólnie wydajny, ponieważ zestaw znaków / kodowanie zostało zaprojektowane specjalnie dla określonych ustawień regionalnych. Pola NVARCHAR przechowują albo w kodowaniu UTF-8, albo UTF-16, wystarczająco ironicznie opierając się na ustawieniach NLS. UTF-8 jest bardzo wydajny dla języków „zachodnich”, a jednocześnie obsługuje języki azjatyckie. UTF-16 jest bardzo wydajny dla języków azjatyckich, a jednocześnie obsługuje języki „zachodnie”. Jeśli martwisz się o przestrzeń dyskową, wybierz ustawienie NLS, aby Oracle stosował odpowiednio UTF-8 lub UTF-16.
Co z prędkością przetwarzania? Większość nowych platform kodowania używa natywnie kodu Unicode (Java, .NET, a nawet C ++ std :: wstring sprzed lat!), Więc jeśli pole bazy danych to VARCHAR, zmusza Oracle do konwersji między zestawami znaków przy każdym czytaniu lub zapisie, co nie jest zbyt dobre. Użycie NVARCHAR pozwala uniknąć konwersji.
Konkluzja: użyj NVARCHAR! Pozwala to uniknąć ograniczeń i zależności, świetnie nadaje się do przestrzeni dyskowej, a zwykle także do wydajności.
Moje dwa centy
Indeksy mogą się nie powieść, gdy nie zostaną użyte poprawne typy danych:
W SQL Server: Gdy masz indeks nad kolumną VARCHAR i wyświetlasz ciąg Unicode, SQL Server nie korzysta z tego indeksu. To samo dzieje się, gdy prezentujesz BigInt w indeksowanej kolumnie zawierającej SmallInt. Nawet jeśli BigInt jest wystarczająco mały, aby być SmallInt, SQL Server nie może korzystać z indeksu. W drugą stronę nie masz tego problemu (podczas dostarczania SmallInt lub Ansi-Code do indeksowanej kolumny BigInt ot NVARCHAR).
Typy danych mogą się różnić w zależności od systemu DBMS (DataBase Management System):
wiedz, że każda baza danych ma nieco inne typy danych, a VARCHAR nie oznacza wszędzie tego samego. Podczas gdy SQL Server ma VARCHAR i NVARCHAR, baza danych Apache / Derby ma tylko VARCHAR, a tam VARCHAR jest w standardzie Unicode.
Głównie nvarchar przechowuje znaki Unicode, a varchar przechowuje znaki inne niż Unicode.
„Unicodes” oznacza 16-bitowy schemat kodowania znaków, umożliwiający kodowanie znaków z wielu innych języków, takich jak arabski, hebrajski, chiński, japoński, w jednym zestawie znaków.
Oznacza to, że Unicode używa 2 bajtów na znak do przechowywania, a nonunicodes używa tylko jednego bajtu na znak do przechowywania. Co oznacza, że unicody wymagają podwójnej pojemności do przechowywania w porównaniu do unicodów.
Masz rację. nvarchar
przechowuje dane Unicode, a varchar
przechowuje dane znaków jednobajtowych. Inne niż różnic magazynowych ( nvarchar
wymaga dwa razy więcej miejsca do przechowywania, jak varchar
), który już wspomniano, głównym powodem, dla preferujących nvarchar
ponad varchar
byłoby internacjonalizacji (tj przechowywania łańcuchów w innych językach).
Powiedziałbym, że to zależy.
Jeśli opracujesz aplikację komputerową, w której system operacyjny działa w standardzie Unicode (podobnie jak wszystkie obecne systemy Windows), a język natywnie obsługuje Unicode (domyślne łańcuchy to Unicode, jak w Javie lub C #), to przejdź do nvarchar.
Jeśli tworzysz aplikację internetową, w której ciągi znaków mają postać UTF-8, a językiem jest PHP, który nadal nie obsługuje natywnie kodu Unicode (w wersjach 5.x), prawdopodobnie varchar będzie prawdopodobnie lepszym wyborem.
Chociaż NVARCHAR
przechowuje Unicode, powinieneś rozważyć przy pomocy sortowania, abyś mógł używać VARCHAR
i zapisywać dane w lokalnych językach.
Wyobraź sobie następujący scenariusz.
Zestawienie twojego DB jest perskie i zapisujesz wartość typu „علی” (perskie pisanie Ali) w VARCHAR(10)
typie danych. Nie ma problemu, a DBMS używa tylko trzech bajtów do przechowywania.
Jeśli jednak chcesz przenieść swoje dane do innej bazy danych i zobaczyć poprawny wynik, docelowa baza danych musi mieć takie samo zestawienie jak cel, który w tym przykładzie jest perski.
Jeśli docelowe sortowanie jest inne, w docelowej bazie danych pojawiają się znaki zapytania (?).
Na koniec pamiętaj, jeśli korzystasz z ogromnej bazy danych, która jest przeznaczona do używania twojego lokalnego języka, zaleciłbym użycie lokalizacji zamiast zbyt dużej ilości spacji.
Wierzę, że projekt może być inny. To zależy od środowiska, w którym pracujesz.
Musiałem spojrzeć na odpowiedzi, a wiele z nich wydaje się polecić do korzystania nvarchar
w ciągu varchar
, ponieważ przestrzeń nie jest już problemem, więc nie ma nic złego w umożliwieniu Unicode dla małego dodatkowego miejsca. Nie zawsze jest to prawdą, gdy chcesz zastosować indeks do kolumny. SQL Server ma limit 900 bajtów wielkości pola, które można indeksować. Więc jeśli masz varchar(900)
, nadal możesz go indeksować, ale nie varchar(901)
. Za nvarchar
pomocą liczba znaków jest zmniejszona o połowę, dzięki czemu można indeksować maksymalnie nvarchar(450)
. Więc jeśli masz pewność, że nie potrzebujesz nvarchar
, nie polecam go używać.
Ogólnie rzecz biorąc, w bazach danych zalecam trzymanie się wymaganego rozmiaru, ponieważ zawsze możesz się rozwijać. Na przykład kolega w pracy pomyślał kiedyś, że korzystanie nvarchar(max)
z kolumny nie jest szkodliwe , ponieważ w ogóle nie mamy problemu z przechowywaniem. Później, kiedy próbowaliśmy zastosować indeks do tej kolumny, SQL Server to odrzucił. Gdyby jednak zaczął od nawet varchar(5)
, moglibyśmy po prostu rozszerzyć go później na to, czego potrzebujemy, bez takiego problemu, który wymagałby od nas wykonania planu migracji w terenie w celu rozwiązania tego problemu.
Jeśli do przechowywania znaku używany jest jeden bajt, istnieje 256 możliwych kombinacji, dzięki czemu można zapisać 256 różnych znaków. Sortowanie to wzór, który określa postacie i zasady, według których są one porównywane i sortowane.
1252, czyli Latin1 (ANSI), jest najczęstszy. Jednobajtowe zestawy znaków są również nieodpowiednie do przechowywania wszystkich znaków używanych w wielu językach. Na przykład niektóre języki azjatyckie mają tysiące znaków, więc muszą używać dwóch bajtów na znak.
Gdy systemy wykorzystujące wiele stron kodowych są używane w sieci, zarządzanie komunikacją staje się trudne. W celu standaryzacji konsorcjum ISO i Unicode wprowadziło Unicode . Unicode używa dwóch bajtów do przechowywania każdego znaku. Oznacza to, że można zdefiniować 65 536 różnych znaków, więc prawie wszystkie znaki można pokryć Unicode. Jeśli dwa komputery używają Unicode, każdy symbol będzie reprezentowany w ten sam sposób i nie jest wymagana konwersja - taka jest idea Unicode.
SQL Server ma dwie kategorie typów danych znakowych:
Jeśli musimy zapisać dane o postaci z wielu krajów, zawsze używaj Unicode.
Muszę powiedzieć tutaj (zdaję sobie sprawę, że prawdopodobnie zamierzam otworzyć się na listwę!), Ale z pewnością jedyny moment, kiedy NVARCHAR
jest bardziej przydatny (zauważ, że jest tam więcej !) Niż VARCHAR
wtedy, gdy wszystkie zestawienia na wszystkich systemów zależnych i samej bazy danych są takie same ...? Jeśli nie, to i tak musi nastąpić konwersja zestawiania, co czyni VARCHAR
tak samo realnym jak NVARCHAR
.
Aby dodać do tego, niektóre systemy baz danych, takie jak SQL Server (przed 2012 rokiem), mają rozmiar strony około. 8 tys. Tak więc, jeśli szukasz przechowywania danych, które można przeszukiwać, a które nie są przechowywane w czymś takim jak pole TEXT
lub, NTEXT
to VARCHAR
zapewnia miejsce o wartości 8k, podczas gdy NVARCHAR
zapewnia tylko 4k (podwójna liczba bajtów, podwójna przestrzeń).
Podsumowując, użycie jednego z nich zależy od:
Śledź różnicę między typem VARCHAR serwera Sql a typem danych NVARCHAR . Tutaj możesz zobaczyć w bardzo opisowy sposób.
Ogólnie rzecz biorąc, nvarchar przechowuje dane jako Unicode, więc jeśli zamierzasz przechowywać dane wielojęzyczne (więcej niż jeden język) w kolumnie danych, potrzebujesz wariantu N.
Główną różnicą między Varchar(n)
i nvarchar(n)
jest:
Varchar
Rozmiar (dane znakowe o zmiennej długości, inne niż Unicode) wynosi do 8000. 1. Jest to typ danych o zmiennej długości
Służy do przechowywania znaków innych niż Unicode
Zajmuje 1 bajt miejsca dla każdej postaci
Nvarchar
: Dane znakowe Unicode o zmiennej długości.
1. Jest to typ danych o zmiennej długości
2. Używany do przechowywania znaków Unicode.
Jeffrey L Whitledge z wynikiem ~ 47000 punktów reputacji zaleca użycie nvarchar
Solomon Rutzky z wynikiem ~ 33200 reputacji zaleca: NIE zawsze używaj NVARCHAR. Jest to bardzo niebezpieczne i często kosztowne podejście / podejście.
Jakie są główne różnice w wydajności między typami danych varchar i nvarchar SQL Server?
https://www.sqlservercentral.com/articles/disk-is-cheap-orly-4
Obie osoby o tak wysokiej reputacji, co wybiera deweloper uczącej się bazy danych serwerów SQL?
Istnieje wiele ostrzeżeń w odpowiedziach i komentarzach dotyczących problemów z wydajnością, jeśli nie jesteś konsekwentny w wyborze.
Istnieją komentarze pro / con nvarchar dotyczące wydajności.
Istnieją komentarze pro / con varchar dotyczące wydajności.
Mam szczególne wymagania dotyczące tabeli z wieloma setkami kolumn, co samo w sobie jest prawdopodobnie niezwykłe?
Wybieram varchar, aby uniknąć zbliżenia się do limitu rozmiaru rekordu tabeli rekordów 8060 bajtów serwera SQL * server 2012.
Użycie nvarchar przekracza dla mnie ten limit 8060 bajtów.
Myślę również, że powinienem dopasować typy danych powiązanych tabel kodów do typów danych podstawowej centralnej tabeli.
Widziałem użycie kolumny varchar w tym miejscu pracy, rząd Australii Południowej, przez poprzednich doświadczonych programistów baz danych, gdzie liczba wierszy tabeli będzie wynosić kilka milionów lub więcej (i bardzo niewiele kolumn nvarchar, jeśli w ogóle, w tych bardzo dużych tabele), więc być może oczekiwane objętości wierszy danych stają się częścią tej decyzji.
nvarchar
jest bezpieczny w użyciu w porównaniu do tego varchar
, aby nasz kod był wolny od błędów (niedopasowanie typu), ponieważ nvarchar
pozwala również na znaki Unicode. Gdy użyjemy where
warunku w zapytaniu SQL Server i jeśli użyjemy =
operatora, to czasami wyrzuca błąd. Prawdopodobnym powodem jest to, że nasza kolumna mapowania będzie inna varchar
. Gdybyśmy zdefiniowali to w nvarchar
tym problemie, to by się nie stało. Nadal trzymamy się varchar
tego problemu i unikamy go, lepiej LIKE
raczej używać słowa kluczowego niż =
.