Проблема при преобразовании из NVARCHAR в VARBINARY

При преобразовании varchar в varbinary я могу вернуть его обратно. Например:

SELECT CAST('_A_Brand1[_1]A5_LP[_1].A5' AS VARBINARY)
      ,CAST('_A_Brand1[_1]A5_LP[_2].A5' AS VARBINARY);

дает два разных выхода:

0x5F415F4272616E64315B5F315D41355F4C505B5F3 1 5D2E4135 0x5F415F4272616E64315B5F315D41355F4C505B5F3 2 5D2E4135

но если я использую nvarchar, я получаю тот же результат:

SELECT CAST(N'_A_Brand1[_1]A5_LP[_1].A5' AS VARBINARY)
      ,CAST(N'_A_Brand1[_1]A5_LP[_2].A5' AS VARBINARY);

0x5F0041005F004200720061006E00640031005B005F0031005D0041003500 0x5F0041005F004200720061006E00640031005B005F0031005D0041003500

Это проблема, потому что позже я не могу выполнять правильные операции:

SELECT CAST(CAST('_A_Brand1[_1]A5_LP[_1].A5' AS VARBINARY) AS VARCHAR(MAX))
      ,CAST(CAST('_A_Brand1[_1]A5_LP[_2].A5' AS VARBINARY) AS VARCHAR(MAX));

SELECT CAST(CAST(N'_A_Brand1[_1]A5_LP[_1].A5' AS VARBINARY) AS NVARCHAR(MAX))
      ,CAST(CAST(N'_A_Brand1[_1]A5_LP[_2].A5' AS VARBINARY) AS NVARCHAR(MAX));

Первое нормально:

_A_Brand1[_1]A5_LP[_1].A5
_A_Brand1[_1]A5_LP[_2].A5

Второй возвращает те же строки (значение потеряно / вырезано):

_A_Brand1[_1]A5
_A_Brand1[_1]A5

person gotqn    schedule 20.06.2017    source источник


Ответы (1)


По умолчанию длина VARBINARY равна 30, поэтому данные усекаются.

Исправленный код:

SELECT CAST(CAST(N'_A_Brand1[_1]A5_LP[_1].A5' AS VARBINARY(MAX)) AS NVARCHAR(MAX))
      ,CAST(CAST(N'_A_Brand1[_1]A5_LP[_2].A5' AS VARBINARY(MAX)) AS NVARCHAR(MAX));
person Mikhail Lobanov    schedule 20.06.2017