Путаница относительно nchar в SQL Server

Я не понимаю приведенную ниже выдержку из nchar и nvarchar.

В нем говорится:

nчар [ ( п ) ]

Строковые данные Unicode фиксированной длины. n определяет длину строки и может принимать значения от 1 до 4000. Размер хранилища удваивается по n байт. Когда кодовая страница сопоставления использует двухбайтовые символы, размер хранилища по-прежнему составляет n байтов. В зависимости от строки размер хранилища в n байтов может быть меньше значения, указанного для n. Синонимы ISO для nchar: национальный символ и национальный характер.

Я нахожу некоторые противоречия в приведенных выше утверждениях, например:

См. второе предложение, где говорится, что размер хранилища равен двум n байтам, а в следующем предложении говорится, что размер хранилища по-прежнему равен n байтам. В первом предложении говорится, что он имеет фиксированную длину, а в 4-м предложении говорится, что размер хранилища в n байтов может быть меньше значения, указанного для n.

Заранее спасибо.


person nanosoft    schedule 23.03.2015    source источник
comment
Последнее не является противоречием. Столбцу nchar(n) можно присвоить менее 'n' символов. Столбец по-прежнему занимает 2*n байтов, а значение фактически дополняется до n символов.   -  person pmbAustin    schedule 24.03.2015
comment
Я подозреваю, что документация ошибочна. Я думаю, они имели в виду, что размер хранилища по-прежнему равен двум n байтам, потому что nchar имеет фиксированную длину.   -  person Chris Steele    schedule 24.03.2015
comment
@pmbAustin: Я понимаю, что вы хотите сказать, на самом деле я разделяю то же мнение, но в документации говорится, что -››› размер хранилища n байтов может быть меньше значения, указанного для n. Я думаю, что размер хранилища должен быть фиксированным, и именно поэтому выполняется заполнение. Не так ли?   -  person nanosoft    schedule 24.03.2015
comment
NCHAR — это тип фиксированной длины — он всегда будет использовать столько символов, сколько определено; а NCHAR — это тип Unicode, что означает 2 байта на символ. Таким образом, NCHAR(20) всегда будет занимать 40 байт.   -  person marc_s    schedule 24.03.2015
comment
@marc_s: Итак, документ сервера sql необходимо исправить :)   -  person nanosoft    schedule 24.03.2015


Ответы (1)


По сути, nchar и nvarchar хранят строки юникода.
Вы видите число символов, которое будет храниться в столбце nchar, или максимальное количество символов, которое будет храниться в столбце nvarchar.
В зависимости от строки размер хранилища nchar может быть меньше n. поскольку nchar имеет фиксированную длину, это означает, что он будет добавлять пробелы к строкам, которые короче n. это означает, что если вы сохраните строку 'h' в столбце nchar(6), она будет рассматриваться как 'h' с 5 пробелами в конце. Я предполагаю, что конечные пробелы на самом деле не хранятся в базе данных, поэтому размер хранилища может быть меньше n.

Однако в nvarchar это не так. nvarchar всегда будет иметь размер хранилища (n*2) + 2 байта.

person Zohar Peled    schedule 23.03.2015
comment
То, что вы догадываетесь о хранилище, - это моя настоящая путаница :) - person nanosoft; 24.03.2015