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 байтов длины.

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