Что означает nvarchar
?
В чем разница между char
, nchar
, varchar
и nvarchar
в SQL Server?
Что означает nvarchar
?
В чем разница между char
, nchar
, varchar
и nvarchar
в SQL Server?
Просто прояснить... или подвести итоги...
nchar
и nvarchar
могут хранить символы Unicode.char
и varchar
не могут хранить символы Unicode.char
и nchar
фиксированная длина, которая будет зарезервировать пространство для хранения для количества которые вы указываете, даже если вы не используете все это пространство.varchar
и nvarchar
переменная длина, которые будут использовать только пробелы для хранящихся вами символов. Он не резервирует хранилище, например char
или nchar
. nchar
и nvarchar
будут занимать в два раза больше места для хранения, поэтому может быть разумным использовать их, только если вам нужна поддержка Unicode.
Все ответы пока показывают, что 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), называемое BRAND, хранит слово NIKE. Он добавляет 6 пробелов справа от слова. Итак, при фильтрации, выражение должно читать: RTRIM (Fields! BRAND.Value) = "NIKE"
Надеюсь, что это поможет кому-то, потому что я борется с ним немного сейчас!
Моя попытка обобщить и исправить существующие ответы:
Во-первых, char
и nchar
всегда будут использовать фиксированный объем пространства для хранения, даже если строка, которая будет сохранена, меньше доступного пространства, тогда как varchar
и nvarchar
будут использовать только столько хранения пространство, необходимое для хранения этой строки (плюс два байта служебных данных, предположительно для хранения длины строки). Поэтому помните, что "var" означает "переменная", как в переменном пространстве.
Второй важный момент для понимания состоит в том, что nchar
и nvarchar
хранить строки, используя ровно два байта на символ, тогда как char
и varchar
используют кодировку, определенную на кодовой странице коллиляции, которая обычно будет ровно один байт на символ (хотя есть исключения, см. ниже). Используя два байта на символ, можно хранить очень широкий диапазон символов, поэтому основная информация, которую следует помнить здесь, состоит в том, что nchar
и nvarchar
имеют тенденцию быть гораздо лучшим выбором, если вы хотите поддержку интернационализации, которую вы, вероятно, делаете.
Теперь для некоторых более тонких точек.
Во-первых, столбцы nchar
и nvarchar
всегда хранят данные, используя UCS-2. Это означает, что будет использоваться ровно два байта на символ, а любой символ Юникода в базовой многоязычной плоскости (BMP) можно сохранить в поле nchar
или nvarchar
. Однако не все символы Юникода могут быть сохранены. Например, согласно Википедии, кодовые пункты для египетских иероглифов выходят за пределы БМП. Таким образом, строки Unicode могут быть представлены в UTF-8 и других истинных кодировках Unicode, которые не могут быть сохранены в поле SQL Server nchar
или nvarchar
, а строки, написанные в египетских иероглифах, будут среди них. К счастью, ваши пользователи, вероятно, не пишут в этом script, но это что-то нужно иметь в виду!
Еще одна запутанная, но интересная точка, которую выделяли другие плакаты, состоит в том, что поля 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
: данные Unicode фиксированной длины с максимальной длиной 4000 символов.char
= длина 8 битnchar
= длина в 16 бит 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.
например,
Символ (100) всегда будет хранить 100 символов, даже если вы вводите только 5, остальные 95 символов будут заполнены пробелами. Сохранение 5 символов в varchar (100) сохранит 5 символов.
Другим отличием является длина. Оба nchar и nvarchar могут содержать до 4000 символов. И char и varchar может содержать до 8000 символов. Но для SQL Server вы также можете использовать [n] varchar (max), который может обрабатывать до 2 147 483 648 символов. (Два гигабайта, подписанное 4-байтовое целое.)
nchar (10) представляет собой строку Unicode фиксированной длины длиной 10. nvarchar (10) представляет собой строку Unicode переменной длины с максимальной длиной 10. Как правило, вы бы использовали первый, если все значения данных равны 10 символам и последний, если длины меняются.
nchar имеет фиксированную длину и может содержать символы юникода. он использует два байтовых хранилища для каждого символа.
varchar имеет переменную длину и не может содержать символы Unicode. он использует одно байтовое хранилище для каждого символа.
NVARCHAR может хранить символы Unicode и принимает 2 байта на символ.
Различия между CHAR, NCHAR, VARCHAR и NVARCHAR?
CHAR:
char [(n)]
Пример:
-- Declare a temporary variable.
Declare @text char
-- Assign value to temporary variable.
Set @text = 'hello'
-- Get temporary variable data.
Select @text as [Output]
Выход: h
Мы получили h как вывод. Потому что мы не указали длину для char. Он будет занимать по умолчанию длину 1.
VARCHAR:
varchar [(n | max)]
NCHAR:
nchar [(n)]
NVARCHAR:
nvarchar [(n | max)]
Подробнее о "Различия между CHAR, NCHAR, VARCHAR и NVARCHAR?" с примерами здесь.