Что подразумевается под nvarchar
?
В чем разница между char
, nchar
, varchar
и nvarchar
в SQL Server?
Что подразумевается под nvarchar
?
В чем разница между char
, nchar
, varchar
и nvarchar
в SQL Server?
Ответы:
Просто чтобы прояснить ... или подвести итог ...
nchar
и nvarchar
может хранить символы Unicode .char
и не может хранить символы Юникода .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 - нет.
Поскольку для символов Юникода требуется больше памяти, поля nchar / nvarchar занимают вдвое больше места (например, в более ранних версиях SQL Server максимальный размер поля nvarchar составляет 4000).
Этот вопрос является дубликатом этого .
Просто добавьте что-то еще: nchar - добавляет завершающие пробелы в данные. nvarchar - не добавляет завершающие пробелы к данным.
Итак, если вы собираетесь фильтровать ваш набор данных по полю 'nchar', вы можете использовать RTRIM для удаления пробелов. Например, поле nchar (10) под названием BRAND хранит слово NIKE. Это добавляет 6 пробелов справа от слова. Таким образом, при фильтрации выражение должно иметь вид: RTRIM (Fields! BRAND.Value) = "NIKE"
Надеюсь, это кому-то поможет, потому что я боролся с этим только сейчас!
Моя попытка обобщить и исправить существующие ответы:
Во-первых, char
и nchar
всегда будет использовать фиксированный объем пространства хранения, даже когда строка, которая должна быть сохранена, меньше доступного пространства, тогда как varchar
и nvarchar
будет использовать столько места, сколько необходимо для хранения этой строки (плюс два байта служебных данных, предположительно для хранения длины строки). Помните, что «var» означает «переменная», как в переменном пространстве.
Вторым важным моментом, который нужно понять, является то, что nchar
и nvarchar
хранить строки, используя ровно два байта на символ, тогда как char
и varchar
использовать кодировку, определенную кодовой страницей сопоставления, которая обычно будет ровно один байт на символ (хотя есть исключения, см. Ниже). Используя два байта на символ, очень широкий диапазон символов может быть сохранен, так что основная вещь , чтобы помнить, что nchar
и , как nvarchar
правило, гораздо лучший выбор , если вы хотите поддержку интернационализации, который вы , вероятно , сделать.
Теперь о некоторых более тонких моментах.
Во- первых, nchar
и nvarchar
столбцы всегда хранить данные с использованием UCS-2. Это означает, что будет использоваться ровно два байта на символ, и любой символ Unicode в базовой многоязычной плоскости (BMP) может быть сохранен полем nchar
или nvarchar
. Однако это не тот случай, когда любой символ Unicode может быть сохранен. Например, согласно Википедии, кодовые точки для египетских иероглифов выходят за пределы BMP. Следовательно, есть строки Unicode, которые могут быть представлены в UTF-8, и другие истинные кодировки Unicode, которые нельзя сохранить в SQL Server nchar
или nvarchar
поле, и строки, написанные в египетских иероглифах, будут среди них. К счастью, ваши пользователи, вероятно, не пишут в этом сценарии, но об этом нужно помнить!
Другой запутанный , но интересный момент , что другие плакаты высветили, что char
и varchar
поля могут использовать два байт на символ для определенных символов , если страница сортировки кода требует. (Мартин Смит приводит отличный пример, в котором он показывает, как Chinese_Traditional_Stroke_Order_100_CS_AS_KS_WS демонстрирует это поведение. Проверьте это.)
ОБНОВЛЕНИЕ: Начиная с SQL Server 2012, наконец, есть кодовые страницы для UTF-16 , например Latin1_General_100_CI_AS_SC, которые действительно могут охватывать весь диапазон Unicode.
char
: символьные данные фиксированной длины с максимальной длиной 8000 символов.nchar
: данные Юникода фиксированной длины с максимальной длиной 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 символов. И char и varchar могут быть длиной до 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 имеет фиксированную длину и может содержать символы Юникода. он использует два байта памяти на символ.
varchar имеет переменную длину и не может содержать символы Юникода. он использует одну байтовую память на символ.
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, но все еще является сжатием строк Unicode в кодировке UCS-2: msdn.microsoft.com/en-us/library/ee240835.aspx
NVARCHAR может хранить символы Unicode и занимает 2 байта на символ.
nvarchar
всегда занимает 2 байта на символ.