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

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

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

12 ответов


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

  • nchar и nvarchar хранить Unicode символы.
  • char и varchar не удается сохранить Unicode символы.
  • char и nchar are фиксированной длины что будет оставляем место для хранения количество символов вы указываете, даже если вы не используете все пространство.
  • varchar и nvarchar are переменной длины, который будет использовать только помещения для символов, которые вы храните. Это не будет резервировать хранилище, как 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  

возвращает

enter image description here

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

на самом деле до сих пор нет китайских символы, которые могут быть reprsented один байт в то сопоставление. Единственными однобайтовыми символами являются типичные западные ASCII-наборы.

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

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


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

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

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


просто добавить что-то еще: nchar - добавляет пробелы в данных. nvarchar не добавлять пробелы в данных.

Итак, если вы собираетесь фильтровать свой набор данных по полю "nchar", вы можете использовать RTRIM для удаления пробелов. Например. поле NCHAR (10) называется фирменным магазином слова NIKE. Он добавляет 6 пробелов справа от слова. Таким образом, при фильтрации выражение должно читать: RTRIM (поля!МАРКА.Значение= ) "NIKE"

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


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

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

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

теперь некоторые тонкости.

во-первых,nchar и nvarchar колонки всегда хранить данные с помощью UCS-2. Это означает, что будет использоваться ровно два байта на символ, и любой символ Юникода в базовой многоязычной плоскости (BMP) может быть сохранен nchar или nvarchar поле. Однако это не так, что любой символ Unicode может быть сохранена. Для например, согласно Википедии, кодовые точки для египетских иероглифов выходят за пределы BMP. Поэтому существуют строки Юникода, которые могут быть представлены в UTF-8 и других истинных кодировках Юникода, которые не могут быть сохранены в 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: данные unicode фиксированной длины с максимальной длиной 4000 символов.
  • Char = 8 бит длина
  • NChar = 16 бит

nchar[(n)] (национального характера)

  • фиксированной длины Unicode строковые данные.
  • n определяет длину строки и должно быть значением от 1 до 4,000.
  • размер хранения в два раза 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 байта.

различия являются:

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

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


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

например,

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


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


  • nchar фиксированной длины и может содержать символы юникода. она использует два байта для хранения символа.

  • тип varchar имеет переменную длину и не может содержать символы Unicode. он использует одно байтовое хранилище на символ.


NVARCHAR может хранить символы Юникода и занимает 2 байта на символ.