T-SQL удивительные значения DATALENGTH для char и nchar
SELECT DATALENGTH('źźźź') -- 4
SELECT DATALENGTH(CONVERT(char, 'źźźź')) -- 30
SELECT DATALENGTH(CONVERT(nchar, 'źźźź')) -- 60
SELECT DATALENGTH(CONVERT(varchar, 'źźźź')) -- 4
SELECT DATALENGTH(CONVERT(nvarchar, 'źźźź')) -- 8
Я знаю, что тип char не-Unicode, но nchar на самом деле является типом Unicode
1 ответ
Да - а какой у тебя вопрос?
Если вы не определяете длину в CAST
или же CONVERT
, то 30 символов - это системное значение по умолчанию.
Так это
SELECT DATALENGTH(CONVERT(char, 'źźźź'))
эквивалентно
SELECT DATALENGTH(CONVERT(char(30), 'źźźź'))
и так как CHAR
(а также NCHAR
) типы данных всегда дополняются до определенной длины, вы получаете 30 символов и, следовательно, 30 (char
) и 60 (nchar
) длина байтов.
Все совершенно ясно и хорошо задокументировано - см. Документацию MSDN по CAST и CONVERT
длина
Необязательное целое число, указывающее длину целевого типа данных. Значение по умолчанию 30.
Когда вы используете строки переменной длины вместо varchar
или же nvarchar
вы сохраняете столько символов, сколько в действительности содержится в строке - поэтому вы получаете 4 символа и, следовательно, 4 и 8 байтов длины.