Але визначення varchar говорить, що воно дозволяє не Unicode рядкові дані . Але товарний знак (™) та зареєстрований (®) символи Unicode символи . Чи суперечить цьому визначенню властивість типу даних варшарів?
Хоча інші відповіді невірні, я вважаю, що це допоможе вказати на плутанину в базовій термінології. Я наголосив два слова у наведеній цитаті з цього питання як приклад цієї плутанини. Коли документація SQL Server говорить про Unicode і не-Unicode даних , вони НЕ говорять про персонажах . Вони говорять про послідовності байтів, які представляють певні символи. Основна відмінність між типами Unicode ( NCHAR
, NVARCHAR
, XML
, і застарілим / злий NTEXT
) і типами НЕ-Unicode ( CHAR
, VARCHAR
і застарілий / злом TEXT
) є те , що типи з послідовності байт вони можуть зберігати.
Типи Unicode зберігають одне з декількох 8-бітових кодувань, тоді як типи Unicode зберігають єдине 16-бітове кодування Unicode: UTF-16 Little Endian. Як було зазначено в інших відповідях, які символи можуть бути збережені у 8-бітному / не-Unicode кодуванні, залежить від кодової сторінки, яка визначається зіставленням. У той час як інші зазначають, що значення байта "символу" може змінюватися в різних кодових сторінках, на яких він знаходиться, але байтове значення може навіть змінюватися в межах однієї кодової сторінки при роботі з однією з декількох сторінок коду EBCDIC (варіації Windows- 1252), які можна знайти лише в старих версіях, насправді не слід використовувати SQL Server Collations (тобто ті, у кого імена починаються з SQL_
).
Отже, визначення є точним: будь-які символи, якими ви можете керувати, зберігати тип не Unicode, завжди є 8-бітним (навіть якщо вони використовують два 8-бітні значення в поєднанні як один "символ", що є тим, що Double- Набір символів байт / кодові сторінки DBCS дозволяють) І типи даних Unicode завжди є 16-бітними, навіть якщо вони іноді використовують два 16-бітні значення в поєднанні як один "символ" (тобто пара сурогат, що, в свою чергу, являє собою додатковий символ).
І, завдяки SQL Server, який підтримує кодування UTF-8 VARCHAR
та CHAR
типи даних станом на SQL Server 2019,
VARCHAR
більше не можна називати "не-Unicode". Отже, починаючи з першої публічної бета-версії SQL Server 2019 у вересні 2018 року, ми повинні називати VARCHAR
"8-бітовий тип даних", навіть якщо говорити з точки зору версій до SQL Server 2019. Ця термінологія справедлива для всіх 4 типів кодувань, які можна використовувати з VARCHAR
:
- Розширений ASCII
- Двобайтові набори символів (DBCS)
- EBCDIC
- UTF-8 (Unicode)
Тільки TEXT
тип даних (застарілий як у SQL Server 2005, тому не використовуйте його) є "не-Unicode", але це лише технічний стан, і посилання на нього як на "8-бітний тип даних" є точним.
NVARCHAR
, NCHAR
і NTEXT
може називатися "UTF-16" або "16-бітовим типом даних". Я вважаю, що Oracle використовує термінологію "тільки для Unicode" для NVARCHAR
, але це не виключає чіткої можливості використання UTF-8 (також кодування Unicode), яка не буде працювати, тому, ймовірно, найкраще дотримуватися перші два варіанти.
Детальніше про нові кодування UTF-8 див. У моєму дописі:
Рідна підтримка UTF-8 у SQL Server 2019: рятівник чи помилковий пророк?
PS Я повільно працюю над оновленням документації на SQL Server, щоб відобразити ці зміни.
PPS Microsoft уже оновив деякі сторінки з інформацією про UTF-8, включаючи документацію char та varchar, на яку посилається питання. Він більше не містить фразу "non-Unicode". Але це просто вигадка; це не змінює питання, оскільки мова йде про кодування Unicode, що містять символи, які помилково вважалися лише Unicode.