Ale definicja varchar mówi, że zezwala na dane łańcuchowe inne niż Unicode . Ale symbole znaków towarowych (™) i zarejestrowanych (®) są znakami Unicode . Czy definicja jest sprzeczna z właściwością typu danych varchar?
Podczas gdy inne odpowiedzi nie są niepoprawne, myślę, że pomogłoby to wskazać na pomyłkę w podstawowej terminologii. Podkreśliłem dwa słowa w powyższym cytacie z pytania jako przykład tego zamieszania. Kiedy dokumentacja SQL Server mówi o Unicode i non-Unicode danych , są one nie mówić o znaki . Mówią o sekwencjach bajtów reprezentujących określone znaki. Podstawowa różnica między typami Unicode ( NCHAR
, NVARCHAR
, XML
, a przestarzałe / zła NTEXT
) i typami non-Unicode ( CHAR
, VARCHAR
, a przestarzałe / zła TEXT
) jest tym, co rodzaje sekwencji bajtów mogą przechowywać.
Typy inne niż Unicode przechowują jedno z kilku 8-bitowych kodowań, podczas gdy typy Unicode przechowują pojedyncze 16-bitowe kodowanie Unicode: UTF-16 Little Endian. Jak wspomniano w innych odpowiedziach, które znaki mogą być przechowywane w kodowaniu 8-bitowym / innym niż Unicode, zależy od strony kodowej, która jest określona przez sortowanie. Podczas gdy inni zauważyli, że wartość bajtu „znaku” może się różnić w zależności od stron kodowych, na których się znajduje, wartość bajtu może nawet różnić się w obrębie tej samej strony kodowej w przypadku jednej z kilku stron kodowych EBCDIC (odmiany systemu Windows- 1252), które można znaleźć tylko w starszych, nie należy tak naprawdę używać kolacji SQL Server (tj. Tych, których nazwy zaczynają się od SQL_
).
Dlatego definicja jest dokładna: wszystkie znaki, które możesz przechowywać w typie innym niż Unicode, są zawsze 8-bitowe (nawet jeśli używają dwóch 8-bitowych wartości w kombinacji jako pojedynczego „znaku”, co właśnie Double- Zestaw znaków bajtów / strony kodowe DBCS pozwalają na). A typy danych Unicode są zawsze 16-bitowe, nawet jeśli czasami używają dwóch 16-bitowych wartości w kombinacji jako pojedynczego „znaku” (tj. Pary zastępczej, która z kolei reprezentuje znak uzupełniający).
ORAZ ze względu na natywną obsługę SQL Server kodowania UTF-8 VARCHAR
i CHAR
typów danych od SQL Server 2019,
VARCHAR
nie może być dłużej określany jako „inny niż Unicode”. Począwszy od pierwszej publicznej wersji beta programu SQL Server 2019 we wrześniu 2018 r., Powinniśmy nazywać go VARCHAR
„8-bitowym typem danych”, nawet jeśli mówimy o wersjach wcześniejszych niż SQL Server 2019. Ta terminologia obowiązuje w przypadku wszystkich 4 typów kodowań, których można używać z VARCHAR
:
- Rozszerzony ASCII
- Zestawy znaków dwubajtowych (DBCS)
- EBCDIC
- UTF-8 (Unicode)
Tylko TEXT
typ danych (przestarzały od SQL Server 2005, więc nie używaj go) jest „inny niż Unicode”, ale to tylko kwestia techniczna, a określenie go jako „typ danych 8-bitowych” jest dokładne.
NVARCHAR
, NCHAR
i NTEXT
może być określany jako „UTF-16” lub „16-bitowy typ danych”. Wierzę, że Oracle używa terminologii „tylko Unicode” NVARCHAR
, ale nie wyklucza to wyraźnie możliwości użycia UTF-8 (również kodowania Unicode), co nie będzie działać, więc prawdopodobnie najlepiej trzymać się dwie pierwsze opcje.
Szczegółowe informacje na temat nowych kodowań UTF-8 znajdują się w moim poście:
Natywne wsparcie UTF-8 w SQL Server 2019: Zbawiciel czy fałszywy prorok?
PS Powoli pracuję nad aktualizacją dokumentacji SQL Server, aby odzwierciedlić te zmiany.
PPS Microsoft zaktualizował już niektóre strony o informacje UTF-8, w tym dokumentację char i varchar wymienioną w pytaniu. Nie zawiera już frazy „non-Unicode”. Ale to tylko informacja finansowa; nie zmienia to pytania, ponieważ dotyczy to kodowań innych niż Unicode zawierających znaki, które błędnie uważano za tylko Unicode.