Что подразумевается под nvarchar
?
В чем разница между char
, nchar
, varchar
и nvarchar
в SQL Server?
Что подразумевается под nvarchar
?
В чем разница между char
, nchar
, varchar
и nvarchar
в SQL Server?
Просто чтобы прояснить ... или подвести итог ...
nchar
и nvarchar
могут хранить символы Unicode.char
и varchar
не могут хранить символы Unicode.char
и nchar
имеют фиксированную длину, что позволяет зарезервировать место для хранения для указанного вами количества символов, даже если вы не Я не использую все это пространство.varchar
и nvarchar
имеют переменную длину, поэтому в них используются только пробелы для хранимых вами символов. Он не резервирует хранилище, например char
или nchar
.nchar
и nvarchar
будут занимать вдвое больше места для хранения, поэтому может быть разумно использовать их только в том случае, если вам нужна поддержка Unicode.
n...
в два раза больше места для хранения , как показывает мой ответ
- person Martin Smith; 24.11.2011
public string StateAbbrv {get;set;}
в приложении.
- person Edward; 22.03.2017
Все ответы на данный момент указывают, что 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 хранят символы 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
используют кодировку, определяемую кодовой страницей сопоставления, которая обычно em> должно быть ровно один байт на символ (хотя есть исключения, см. ниже). Используя два байта на символ, можно сохранить очень широкий диапазон символов, поэтому важно помнить, что 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.
char
: символьные данные фиксированной длины с максимальной длиной 8000 символов.nchar
: данные Unicode фиксированной длины с максимальной длиной 4000 символов.Char
= длина 8 битNChar
= длина 16 битchar
не может иметь длину 8 бит. Он не должен хранить длину, и фиксированная длина может составлять до 8000 символов.
- person John B. Lambe; 16.07.2019
nchar[(n)]
(национальный символ)
n
определяет длину строки и должно быть значением от 1 до 4 000.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 (10) - это строка Unicode фиксированной длины длиной 10. nvarchar (10) - строка Unicode переменной длины с максимальной длиной 10. Как правило, вы должны использовать первую строку, если все значения данных составляют 10 символов, а последнюю. если длина различается.
Еще одно отличие - длина. И 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 имеет фиксированную длину и может содержать символы Юникода. он использует два байта памяти для каждого символа.
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.aspx
- person Remus Rusanu; 18.12.2010
NVARCHAR может хранить символы Юникода и занимает 2 байта на символ.
nvarchar
всегда занимает 2 байта на символ.
- person Martin Smith; 24.11.2011