Что подразумевается под nvarchar
?
В чем разница между char
, nchar
, varchar
и nvarchar
в SQL Server?
sql-server
varchar
MrDatabase
источник
источник
n...
занимают ли версии вдвое больше места для хранения, чем показывает мой ответВсе ответы пока указывают, что
varchar
это один байт,nvarchar
это двойной байт. Первая часть этого на самом деле зависит от сопоставления, как показано ниже.Возвращает
Обратите внимание , что
华
и国
персонажи еще не были представлены в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 Servernchar
или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.aspxNVARCHAR может хранить символы Unicode и занимает 2 байта на символ.
источник
nvarchar
всегда занимает 2 байта на символ.