В чем разница между char, nchar, varchar и nvarchar в SQL Server? - PullRequest
574 голосов
/ 07 октября 2008

Что означает nvarchar?

В чем разница между char, nchar, varchar и nvarchar в SQL Server?

Ответы [ 12 ]

793 голосов
/ 07 октября 2008

Просто чтобы прояснить ... или подвести итог ...

  • nchar и nvarchar могут хранить Unicode символов.
  • char и varchar не может хранить Unicode символов.
  • char и nchar равны фиксированной длины , что резервирует место для хранения для количества символов, которое вы укажете даже если ты не используешь все это пространство.
  • varchar и nvarchar равны переменной длины , которые будут использовать только пробелы для сохраненных вами символов. не будет резервировать хранилище, как char или nchar.

nchar и nvarchar займут вдвое больше места для хранения, поэтому целесообразно использовать их, только если вам нужна поддержка Unicode .

88 голосов
/ 24 ноября 2011

Все ответы до сих пор указывают, что 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  

Возвращает

enter image description here

Обратите внимание, что символы и все еще не были представлены в версии VARCHAR и были заменены на ?.

.

На самом деле до сих пор нет китайских символов, которые можно представить одним байтом в этом сопоставлении. Единственные однобайтовые символы - это типичный западный набор ASCII.

Из-за этого возможна ошибка вставки из столбца nvarchar(X) в столбец varchar(X) с ошибкой усечения (где X обозначает число, одинаковое в обоих случаях) .

SQL Server 2012 добавляет параметры сортировки SC (дополнительных символов), которые поддерживают UTF-16. В этих сопоставлениях один символ nvarchar может занимать 2 или 4 байта.

33 голосов
/ 07 октября 2008

nchar и char в основном работают точно так же, как и nvarchar и varchar. Единственная разница между ними заключается в том, что nchar / nvarchar хранит символы Unicode (необходимо, если вам требуется использование расширенных наборов символов), а varchar - нет.

Поскольку для символов Юникода требуется больше места, поля nchar / nvarchar занимают вдвое больше места (например, в более ранних версиях SQL Server максимальный размер поля nvarchar составляет 4000).

Этот вопрос является дубликатом этого .

32 голосов
/ 21 июля 2011

Просто чтобы добавить что-то еще: nchar - добавляет завершающие пробелы в данные. nvarchar - не добавляет завершающие пробелы к данным.

Итак, если вы собираетесь фильтровать ваш набор данных по полю 'nchar', вы можете использовать RTRIM для удаления пробелов. Например. Поле nchar (10) с именем BRAND хранит слово NIKE. Это добавляет 6 пробелов справа от слова. Итак, при фильтрации выражение должно выглядеть так: RTRIM (Поля! BRAND.Value) = "NIKE"

Надеюсь, это кому-то поможет, потому что я боролся с этим только сейчас!

22 голосов
/ 27 июня 2013

Моя попытка обобщить и исправить существующие ответы:

Во-первых, char и nchar всегда будут использовать фиксированный объем пространства хранения, даже когда строка для хранения меньше доступного пространства, тогда как varchar и nvarchar будут использовать только столько памяти пространство, необходимое для хранения этой строки (плюс два байта служебной информации, предположительно для хранения длины строки). Помните, что «var» означает «переменная», как в переменном пространстве.

Второй важный момент, который нужно понять, заключается в том, что nchar и nvarchar хранят строки, используя точно два байта на символ, тогда как char и varchar используют кодировку, определенную кодом сопоставления страница, которая обычно будет составлять ровно один байт на символ (хотя есть исключения, см. ниже). Используя два байта на символ, можно сохранить очень широкий диапазон символов, поэтому следует помнить, что nchar и nvarchar имеют тенденцию быть гораздо лучшим выбором, когда вам нужна поддержка интернационализации, что вы, вероятно, делаете .

Теперь о некоторых тонких точках.

Во-первых, nchar и nvarchar столбцы всегда хранят данные с использованием UCS-2. Это означает, что будет использоваться ровно два байта на символ, и любой символ Юникода в базовой многоязычной плоскости (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.

14 голосов
/ 02 ноября 2009
  • char: символьные данные фиксированной длины с максимальной длиной 8000 символов.
  • nchar: данные Юникода фиксированной длины с максимальной длиной 4000 символов.
  • Char = длина 8 бит
  • NChar = длина 16 бит
9 голосов
/ 10 февраля 2015

nchar[(n)] (национальный символ)

  • Фиксированная длина Юникод строковые данные.
  • n определяет длину строки и должно быть значением от 1 до 4000.
  • Размер хранилища в два раза больше n байт.

nvarchar [(n | max)] (разные национальные символы.)

  • Переменная длина Unicode строковые данные.
  • n определяет длину строки и может принимать значение от 1 до 4000.
  • max указывает, что максимальный размер хранилища составляет 2 ^ 31-1 байт (2 ГБ).
  • Размер хранилища в байтах в два раза превышает фактическую длину введенных данных + 2 байта

char [(n)] (символ)

  • Строковые данные фиксированной длины, non-Unicode.
  • n определяет длину строки и должно быть значением от 1 до 8000.
  • Размер хранилища составляет n байт.

varchar [(n | max)] (изменение символов)

  • Переменная длина, не-Unicode строковые данные.
  • n определяет длину строки и может принимать значение от 1 до 8000.
  • max указывает, что максимальный размер хранилища составляет 2 ^ 31-1 байт (2 ГБ).
  • Размер хранилища - это фактическая длина введенных данных + 2 байта.
7 голосов
/ 02 ноября 2009

Различия :

  1. n [var] char хранит юникод, в то время как [var] char просто хранит однобайтовые символы.
  2. [n] char требует фиксированного количества символов точной длины, в то время как [n] varchar принимает переменное количество символов вплоть до определенной длины.

Другое отличие - длина. И nchar, и nvarchar могут содержать до 4000 символов. И char и varchar могут быть длиной до 8000 символов. Но для SQL Server вы также можете использовать [n] varchar (max), который может обрабатывать до 2 147 483 648 символов. (Два гигабайта, 4-байтовое целое со знаком.)

7 голосов
/ 18 ноября 2008

nchar требует больше места, чем nvarchar.

например,

Символ (100) всегда будет хранить 100 символов, даже если вы введете только 5, остальные 95 символов будут дополнены пробелами. Хранение 5 символов в varchar (100) спасет 5 символов.

5 голосов
/ 07 октября 2008

nchar (10) - строка Unicode фиксированной длины длиной 10. nvarchar (10) - строка Unicode переменной длины с максимальной длиной 10. Как правило, вы должны использовать первое, если все значения данных состоят из 10 символов и последний, если длина варьируется.

...