2017-06-20 203 views
0

varchar转换为varbinary时,我可以将其还原。例如:将NVARCHAR转换为VARBINARY时的问题

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

给出两个不同的输出:

0x5F415F4272616E64315B5F315D41355F4C505B5F3 5D2E4135 0x5F415F4272616E64315B5F315D41355F4C505B5F3 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 

回答

3

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));