Що означає nvarchar
?
У чому різниця між char
, nchar
, varchar
і nvarchar
в SQL Server?
Що означає nvarchar
?
У чому різниця між char
, nchar
, varchar
і nvarchar
в SQL Server?
Відповіді:
Просто, щоб очистити ... або підбити підсумки ...
nchar
і nvarchar
може зберігати символи Unicode .char
і не може зберігати символи Unicode .varchar
char
і nchar
мають фіксовану довжину, що дозволить зберегти місце для зберігання для кількості вказаних вами символів, навіть якщо ви не використовуєте весь цей простір.varchar
і nvarchar
мають змінну довжину, яка використовуватиме пробіли лише для символів, які ви зберігаєте. Він не зарезервує сховище типу char
абоnchar
.nchar
і nvarchar
займе вдвічі більше місця для зберігання, тому може бути розумним використовувати їх, лише якщо вам потрібна підтримка Unicode .
n...
займають версії вдвічі більше місця для зберігання, ніж показує моя відповідь
Усі відповіді поки що вказують, що varchar
однобайтовий, nvarchar
це подвійний байт. Перша частина цього насправді залежить від порівняння, як показано нижче.
DECLARE @T TABLE
(
C1 VARCHAR(20) COLLATE Chinese_Traditional_Stroke_Order_100_CS_AS_KS_WS,
C2 NVARCHAR(20)COLLATE Chinese_Traditional_Stroke_Order_100_CS_AS_KS_WS
)
INSERT INTO @T
VALUES (N'中华人民共和国',N'中华人民共和国'),
(N'abc',N'abc');
SELECT C1,
C2,
LEN(C1) AS [LEN(C1)],
DATALENGTH(C1) AS [DATALENGTH(C1)],
LEN(C2) AS [LEN(C2)],
DATALENGTH(C2) AS [DATALENGTH(C2)]
FROM @T
Повертається
Зауважте, що символи 华
та 国
символи досі не були представлені у VARCHAR
версії та їх мовчки замінювали ?
.
Насправді досі немає китайських символів, які можна представити одним байтом у цьому зіставленні. Єдиними однобайтовими символами є типовий західний набір ASCII.
Через це можливо, що вставка зі nvarchar(X)
стовпця до varchar(X)
стовпця не може мати помилку усікання (де X позначає число, однакове в обох екземплярах).
SQL Server 2012 додає порівняння SC (додаткових символів), які підтримують UTF-16
. У цих зіставленнях один nvarchar
символ може займати 2 або 4 байти.
nchar та char в значній мірі діють точно так само, як один одного, як і nvarchar та varchar. Єдина відмінність між ними полягає в тому, що nchar / nvarchar зберігає символи Unicode (важливо, якщо потрібно використовувати розширені набори символів), тоді як varchar цього не робить.
Оскільки символам Unicode потрібно більше пам’яті, поля nchar / nvarchar займають вдвічі більше місця (наприклад, у попередніх версіях SQL Server максимальний розмір поля nvarchar - 4000).
Це питання є дублікатом цього .
Просто додати щось більше: nchar - додає проміжні проміжки до даних. nvarchar - не додає проміжки проміжків до даних.
Отже, якщо ви збираєтеся фільтрувати ваш набір даних за полем 'nchar', ви можете скористатися RTRIM для видалення пробілів. Наприклад, поле nchar (10) під назвою БРЕНД зберігає слово NIKE. Він додає 6 пробілів праворуч від слова. Отже, під час фільтрації вираз повинен читати: RTRIM (Поля! BRAND.Value) = "NIKE"
Сподіваюся, це допомагає комусь там, тому що я трохи боровся з цим!
Моя спроба узагальнити та виправити існуючі відповіді:
По-перше, char
і nchar
завжди використовуватиме фіксовану кількість місця для зберігання, навіть коли рядок, який потрібно зберігати, менший, ніж наявний простір, тоді як varchar
і nvarchar
буде використовувати лише стільки місця, скільки потрібно для зберігання цього рядка (плюс два байти накладних витрат, імовірно, щоб зберегти довжину рядка). Тому пам’ятайте, що "var" означає "змінну", як у змінному просторі.
Другий головний момент, який потрібно зрозуміти, полягає в тому, що nchar
і nvarchar
зберігайте рядки, використовуючи рівно два байти на символ, тоді як char
і varchar
використовуйте кодування, визначене кодовою сторінкою зіставлення, яка зазвичай буде рівно одним байтом на символ (хоча є винятки, див. Нижче). Використовуючи два байти на персонаж, можна зберігати дуже широкий діапазон символів, тому основне, що слід пам’ятати тут, - це nchar
і, nvarchar
як правило, є набагато кращим вибором, коли ви хочете підтримати інтернаціоналізацію, що ви, мабуть, робите.
Тепер ще кілька тонких моментів.
По- перше, nchar
і nvarchar
стовпці завжди зберігати дані з використанням UCS-2. Це означає, що буде використано рівно два байти на символ, а будь-який символ Unicode в базовій багатомовній площині (BMP) може бути збережений у полі nchar
або в nvarchar
полі. Однак це не так, що будь-який символ Unicode може бути збережений. Наприклад, згідно з Вікіпедією, кодові точки для єгипетських ієрогліфів виходять за межі БМП. Тому існують рядки Unicode, які можуть бути представлені в UTF-8 та інші справжні кодування Unicode, які не можуть бути збережені на SQL сервері nchar
чи nvarchar
полі, а рядки, написані в єгипетських ієрогліфах, були б серед них. На щастя, ваші користувачі, ймовірно, не пишуть у цьому сценарії, але це потрібно пам’ятати!
Інший заплутаний , але цікавий момент , що інші плакати висвітили, що char
і varchar
поля можуть використовувати два байт на символ для певних символів , якщо сторінка сортування коду вимагає. (Мартін Сміт наводить чудовий приклад, в якому він показує, як китайська_традиційна_Строке_Ордер_100_CS_AS_KS_WS проявляє цю поведінку. Перевірте це.)
ОНОВЛЕННЯ: Станом на SQL Server 2012, нарешті, існують кодові сторінки для UTF-16 , наприклад Latin1_General_100_CI_AS_SC, які можуть справді охопити весь діапазон Unicode.
char
: дані символів фіксованої довжини з максимальною довжиною 8000 символів.nchar
: дані Unicode фіксованої довжини з максимальною довжиною 4000 символів.Char
= 8 бітова довжинаNChar
= 16 бітова довжинаchar
не могла мати 8-бітну довжину. Він не повинен зберігати довжину, і фіксована довжина може становити до 8000 символів.
nchar[(n)]
(національний характер)
n
визначає довжину рядка і має бути значенням від 1 до 4000.n
.nvarchar [(n | max)]
(національний характер змінюється.)
n
визначає довжину рядка і може бути значенням від 1 до 4000.max
вказує, що максимальний розмір пам’яті становить 2 ^ 31-1 байт (2 ГБ).char [(n)]
(персонаж)
non-Unicode
Дані рядка з фіксованою довжиною .n
визначає довжину рядка і має бути значенням від 1 до 8000.n
байти.varchar [(n | max)]
(характер змінюється)
n
визначає довжину рядка і може бути значенням від 1 до 8000.max
вказує, що максимальний розмір пам’яті становить 2 ^ 31-1 байт (2 ГБ).Ще одна різниця - довжина. І nchar, і nvarchar можуть містити до 4000 символів. А чар і варчар можуть мати довжину до 8000 символів. Але для SQL Server ви також можете використовувати [n] varchar (max), який може обробляти до 2,147,483,648 символів. (Два гігабайти, підписане 4-байтове ціле число.)
nchar вимагає більше місця, ніж nvarchar.
наприклад,
Nchar (100) завжди буде зберігати 100 символів, навіть якщо ви введете лише 5, решта 95 символів будуть пробілами. Збереження 5 символів в nvarchar (100) дозволить зберегти 5 символів.
nchar (10) - рядок Unicode фіксованої довжини 10. nvarchar (10) - рядок Unicode змінної довжини з максимальною довжиною 10. Як правило, ви використовуєте перший, якщо всі значення даних становлять 10 символів, а останній якщо довжини різні.
nchar має фіксовану довжину і може містити символи unicode. він використовує два байти зберігання на символ.
varchar має різну довжину і не може містити символи unicode. він використовує один байт сховища на символ.
UCS-2
(що трапляється кодування використовується SQL Server) зберігає кожен символ в рівно два байта, см msdn.microsoft.com/en-us/library/bb330962%28v=sql.90%29.aspx : SQL Server stores Unicode in the UCS-2 encoding scheme... UCS-2 is a fixed-length encoding that represents all characters as a 16-bit value (2 bytes)
. SQL Server 2008 може використовувати стиснення SCSU
NVARCHAR може зберігати символи Unicode і займає 2 байти на символ.
nvarchar
завжди займає 2 байти на символ.