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
lub VARCHAR
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 to NCHAR
lub NVARCHAR
. 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-8VARCHAR
, 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 w BINARY
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).