为什么在SQL Server中CONVERT字符串到VARBINARY只转换第一个字符?

Cla*_*unt 7 sql varchar nlog varbinary

我正在使用NLog登录我的应用程序,作为其中一部分,我们记录了客户编号,这是C#中的字符串,以及数据库中的varbinary(32).我对此特定参数使用以下SQL代码.SQL语句的其余部分工作正常:

CONVERT(varbinary(32), @CustNumber)
Run Code Online (Sandbox Code Playgroud)

和以下NLog参数:

<parameter name="@CustNumber" layout="${event-context:item=CustNumber}" />
Run Code Online (Sandbox Code Playgroud)

和C#中的以下代码一起添加Nlog参数:

myEvent.Properties.Add("CustNumber", custNumber);
Run Code Online (Sandbox Code Playgroud)

由于某种原因,存储在实际表中的值仅是原始客户编号字符串的第一个字符.我有双重和三重检查,以确保我没有截断字符串发送到数据库之前.任何帮助将不胜感激.

Phi*_*hil 10

原因是当您插入时将Unicode(nvarchar(xx))字符串转换为varbinary.然后,当您选择转换为varchar(xx)时.如果你转换为nvarchar(xx)它将工作正常.

例如:

  • 插入'这是一个测试',因为varbinary(30)导致0x7468697320697320612074657374.

  • 插入N'this是一个测试'作为varbinary(30)导致0x74006800690073002000690073002000610020007400650073007400.

因此,当您转换回来时,如果指定varchar(30),则第一个00将截断字符串.

这对我来说很好:

delete from Table_2

insert Table_2 (Test) values( CONVERT(varbinary(30), N'this is a test') ) 
select * from Table_2
select CONVERT(nvarchar(30), test) from Table_2
Run Code Online (Sandbox Code Playgroud)

这样做

delete from Table_2

insert Table_2 (Test) values( CONVERT(varbinary(30), 'this is a test') )
select * from Table_2
select CONVERT(varchar(30), test) from Table_2
Run Code Online (Sandbox Code Playgroud)

  • 不,然后我得到日语 (2认同)