Что подразумевается под nvarchar
?
В чем разница между char
, nchar
, varchar
и nvarchar
в SQL Server?
Просто чтобы прояснить... или подвести итог...
nchar
и nvarchar
могут хранить Unicode символы.char
и varchar
не могут хранить символы Unicode .char
и nchar
имеют фиксированную длину , которая резервирует пространство хранения для количества символов, которые вы указываете, даже если вы не используете все это пространство ,.varchar
и nvarchar
являются переменной длиной , которые будут использовать только пробелы для символов, которые вы храните. Он не будет резервировать хранилище, как char
или nchar
.nchar
и nvarchar
займут вдвое больше места для хранения, поэтому может быть целесообразно использовать их, только если вам нужна поддержка Unicode .
Пока все ответы указывают на то, что «варчар» является одним байтом, «нварчар» - двойным байтом. Первая часть этого фактически зависит от сопоставления, как показано ниже.
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)
[сбой с ошибкой усечения](https://dba.stackexchange.com/questions/123379/ string-or-binary-data-would-truncated-error-copying-nvarchar.
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) под названием BRAND хранит слово 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 может быть сохранен. Например, согласно Википедии, кодовые точки для египетских иероглифов выходят за пределы 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 бит nchar [(n)]
(национальный характер)
n
определяет длину строки и должно быть значением от 1 до 4000. 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.
например,
Char (100) всегда будет хранить 100 символов, даже если вы вводите только 5, the оставшиеся 95 символов будут дополнены пробелами. Хранение 5 символов в varchar (100) сэкономит 5 символов.
Другое отличие - длина. И nchar, и nvarchar могут иметь длину до 4000 символов. А чар и варчар могут быть длиной до 8000 символов. Но для SQL Server вы также можете использовать [n] varchar (max), который может обрабатывать до 2 147 483 648 символов. (Два гигабайта, подписанное 4-байтовое целое число.)
nchar(10) - это строка Юникода фиксированной длины, имеющая длину 10. nvarchar(10) - это строка Юникода переменной длины, максимальная длина которой равна 10. Как правило, первый вариант используется, если все значения данных состоят из 10 символов, а второй - если длина варьируется.
nchar имеет фиксированную длину и может содержать символы Unicode. он использует два байта хранилища на символ.
varchar имеет переменную длину и не может содержать символы Unicode. он использует один байт хранилища на символ.
NVARCHAR может хранить символы Unicode и занимает 2 байта на символ.