Простое объяснение состоит в том, что тип данных char имеет пробелы справа, чтобы сделать его длиной переменной.Итак, если у вас есть char (6) и вы установите его в '3', значение в переменной будет фактически 3-space-space-space-space-space.Это 3, за которыми следуют 5 пробелов, чтобы сделать общую длину = 6 символов.
Когда вы добавляете 6 нулей слева от строки, SQL выполняет некоторые преобразования типов данных.Жесткое кодирование строки приведет к появлению varchar, поэтому у '000000' будет тип данных varchar (6).Когда вы добавляете char и varchar, получается varchar с объединенными длинами.
'000000' + Convert(Char(6), int)
VarChar(6) + Char(6)
varchar(12)
В части Char (6) по-прежнему будут пробелы справа от данных, поэтому, когда вы берете 6 самых правых символов, вы получаете пробелы.
varchar не дополняется пробелами на конце, поэтому он работает точно так, как вы ожидаете.
PROOF:
Declare @ID Int
Set @Id = 3
-- Data type after converting to char (results in char(6))
SELECT SQL_VARIANT_PROPERTY(Convert(Char(6), @id), 'BaseType') As DatType,
SQL_VARIANT_PROPERTY(Convert(Char(6), @id), 'MaxLength') As Length,
Convert(Char(6), @id)
-- data type of hard coded string (Results in varchar(6))
SELECT SQL_VARIANT_PROPERTY('000000', 'BaseType') As DatType,
SQL_VARIANT_PROPERTY('000000', 'MaxLength') As Length,
'000000'
-- data type of varchar concatenate char (Results in varchar(12))
SELECT SQL_VARIANT_PROPERTY('000000' + Convert(Char(6), @id), 'BaseType') As DataType,
SQL_VARIANT_PROPERTY('000000' + Convert(Char(6), @id), 'MaxLength') As Length,
'000000' + Convert(Char(6), @id)
-- data type of the result (results in varchar(6))
SELECT SQL_VARIANT_PROPERTY(Right('000000' + Convert(Char(6), @id), 6), 'BaseType') As DataType,
SQL_VARIANT_PROPERTY(Right('000000' + Convert(Char(6), @id), 6), 'MaxLength') As Length,
Right('000000' + Convert(Char(6), @id), 6)