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

StackOverflow https://stackoverflow.com/questions/176514

  •  05-07-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

Просто чтобы прояснить ситуацию...или подведем итог...

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

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

Другие советы

Все ответы на данный момент указывают на то, что 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 байта.

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

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

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

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

Итак, если вы собираетесь фильтровать ваш набор данных по полю 'nchar', вы можете использовать RTRIM для удаления пробелов. Например. Поле nchar (10) с именем BRAND хранит слово NIKE. Это добавляет 6 пробелов справа от слова. Итак, при фильтрации выражение должно выглядеть так: RTRIM (Поля! 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, которые нельзя сохранить в поле nchar или nvarchar SQL Server, и записанные строки в египетских иероглифах будет среди них. К счастью, ваши пользователи, вероятно, не пишут в этом сценарии, но об этом нужно помнить!

Еще один сбивающий с толку, но интересный момент, который подчеркивали другие авторы, заключается в том, что поля 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 бит

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

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

nvarchar [(n | max)] (национальный характер меняется.)

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

char [(n)] (персонаж)

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

varchar [(n | max)] (характер меняется)

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

Различия :

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

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

    например,

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

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

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

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

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

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top