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

Что подразумевается под nvarchar?

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

12 ответов

Решение

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

  • 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 хранит символы Юникода (это необходимо, если вам требуется использование расширенных наборов символов), а 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 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.

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

  • Строковые данные Unicode фиксированной длины.
  • 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 байта.
  • char: символьные данные фиксированной длины с максимальной длиной 8000 символов.
  • nchar: данные Юникода фиксированной длины с максимальной длиной 4000 символов.
  • Char = Длина 8 бит
  • NChar Длина = 16 бит

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

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

например,

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

Различия:

  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 имеет фиксированную длину и может содержать символы Юникода. он использует два байта памяти на символ.

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

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

Различия между CHAR, NCHAR, VARCHAR и NVARCHAR?

СИМВОЛ:

символ [ ( n) ]

  • Размер хранилища составляет n байтов.
  • ISO-символом char является символ.

Пример:

-- Declare a temporary variable.
Declare @text char

-- Assign value to temporary variable.
Set @text = 'hello'

-- Get temporary variable data.
Select @text as [Output]

Выход: ч

Мы получили ч в качестве выхода. Потому что мы не указали никакой длины для символа. Длина по умолчанию будет равна 1.

VARCHAR:

varchar [(n | max)]

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

NCHAR:

нчар [(н)]

  • Строковые данные Unicode фиксированной длины.
  • n определяет длину строки и должен быть значением от 1 до 4000.
  • Синонимы ISO для nchar - национальный символ и национальный символ.

NVARCHAR:

nvarchar [(n | max)]

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

Узнайте больше о "Разницах между CHAR, NCHAR, VARCHAR и NVARCHAR?" с примерами здесь.

Другие вопросы по тегам