Uczę się T-SQL. Z przykładów, które widziałem, aby wstawić tekst do varchar()
komórki, mogę napisać tylko ciąg do wstawienia, ale w przypadku nvarchar()
komórek każdy przykład poprzedza ciąg literą N.
Próbowałem następujące zapytanie w tabeli, która ma nvarchar()
wiersze, i działa dobrze, więc przedrostek N nie jest wymagany:
insert into [TableName] values ('Hello', 'World')
Dlaczego ciągi są poprzedzone literą N w każdym przykładzie, który widziałem?
Jakie są zalety i wady używania tego prefiksu?
sql
sql-server
character-encoding
unicode
qinking126
źródło
źródło
N
oznacza Krajowy, jak w „Różnych znakach narodowych”, patrz Równoważne typy danych ANSI SQL .VARCHAR
doNVARCHAR
kiedy mój ciąg dosłowny jest ASCII?”.Odpowiedzi:
NVarchar jest używany w Unicode. Jeśli baza danych nie przechowuje danych wielojęzycznych, możesz nadal korzystać z Varchar. Na przykład:
N'abc'
po prostu konwertuje łańcuch znaków na Unicode.źródło
U&'abc'
to właściwy sposób na określenie ciągów znaków Unicode. Zobacz SQL 2003 BNFDomyślnie SQL Server używa kodów znakowych Windows-1252 dla varchar . Zawiera większość znaków dla języków łacińskich (angielski, niemiecki, francuski itp.), Ale nie zawiera znaków dla języków innych niż łaciński (polski, rosyjski itp.). Jak stwierdził @Pieter B, nvarchar służy do obejścia tego problemu, ponieważ dotyczy Unicode, który zawiera brakujące znaki. To kosztuje, zajmuje dwa razy więcej miejsca do przechowywania nvarchar niż varchar.
Umieszczenie N przed łańcuchem gwarantuje, że znaki zostaną przekonwertowane na Unicode przed umieszczeniem w kolumnie nvarchar. Przez większość czasu nic ci nie będzie, ale nie poleciłbym tego. O wiele lepiej być bezpiecznym niż żałować.
źródło
Ponieważ MS SQL Server ma słabą obsługę UTF-8 w porównaniu do innych RDBMS.
MS SQL Server jest zgodny z konwencją, używaną w samym systemie Windows, że „wąskie” ciągi znaków (
char
w C ++CHAR
lubVARCHAR
SQL) są zakodowane w starszej „stronie kodowej”. Problem ze stronami kodowymi polega na tym, że mają ograniczoną liczbę znaków (większość to kodowania jednobajtowe, co ogranicza reportoire do 256 znaków) i są zaprojektowane wokół jednego języka (lub grupy języków o podobnych alfabetach). Utrudnia to przechowywanie danych wielojęzycznych. Na przykład nie można przechowywać danych rosyjskich i hebrajskich, ponieważ rosyjski używa strony kodowej 1251, a hebrajski używa strony kodowej 1255 .Unicode rozwiązuje ten problem, używając jednego gigantycznego zestawu kodowanych znaków z miejscem na ponad milion znaków, wystarczającym do reprezentowania każdego języka na świecie. Istnieje kilka schematów kodowania Unicode; Microsoft woli używać UTF-16 ze względów historycznych . Ponieważ UTF-16 reprezentuje ciągi jako sekwencję 16-bitowych jednostek kodu zamiast tradycyjnego 8-bitowego, potrzebny jest osobny typ znaku. W MSVC ++ jest to
wchar_t
. A w MS SQL toNCHAR
lubNVARCHAR
.N
Stoi za „narodowe” , co wydaje się wstecz do mnie, bo jest o Unicode między -nationalization, ale to terminologia ISO.Inne implementacje SQL pozwalają przechowywać tekst UTF-8 w
VARCHAR
kolumnie. UTF-8 to kodowanie o zmiennej długości (1-4 bajtów na znak), które jest zoptymalizowane dla przypadku, gdy twoje dane są głównie w podstawowym zakresie łacińskim (które są reprezentowane jako taki sam 1 bajt na znak jak ASCII), ale mogą reprezentować dowolny znak Unicode. W ten sposób unikniesz problemu „dwa razy więcej miejsca” wspomnianego przez bwalk2895.Niestety, MS SQL Server nie obsługuje UTF-8
VARCHAR
, więc zamiast tego musisz albo użyć UTF-16 (i marnować miejsce na tekst ASCII), użyć strony kodowej innej niż Unicode (i utracić możliwość reprezentowania obcych znaków), lub przechowywać UTF-8 wBINARY
kolumnie (i radzić sobie z niedogodnościami, takimi jak nieprawidłowe działanie ciągów SQL lub konieczność przeglądania danych jako zrzut szesnastkowy w menedżerze DB GUI).źródło