【问题标题】:why is CONVERT string to VARBINARY in SQL Server only converting first character?为什么 SQL Server 中的 CONVERT string to VARBINARY 只转换第一个字符?
【发布时间】:2012-05-09 19:10:53
【问题描述】:

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

CONVERT(varbinary(32), @CustNumber)

以及以下 NLog 参数:

<parameter name="@CustNumber" layout="${event-context:item=CustNumber}" />

和下面的C#代码添加Nlog参数:

myEvent.Properties.Add("CustNumber", custNumber);

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

【问题讨论】:

  • 为什么要将字符串记录到varbinary 而不是varchar/nvarchar
  • 只是我公司的要求,我想这是对安全措施的幼稚尝试。我的职责不是问为什么,只是对着电脑尖叫。
  • 截断为 1 通常意味着您在参数或变量定义中缺少长度声明。不熟悉NLog,但这是否需要长度属性?
  • 如果我是,我完全不知道那会在哪里。我在 C# 端使用一个字符串,那里没有大小声明。我在转换中使用了 varbinary(32)。那里有明确的尺寸声明。我在表中使用了 varbinary(32)。那里有明确的尺寸声明。我在 Nlog 中使用内联 SQL - commandText 来运行此查询,但您没有为 Nlog 定义我知道的参数长度。我要仔细检查一下……是的,nlog 没有大小。
  • @ClaytonHunt - 看起来一个需要设置from the grammar heresize属性。您可以使用 SQL Server Profiler 查看发送到数据库的命令,如果这没有帮助,可能会有所帮助......

标签: sql nlog varchar varbinary


【解决方案1】:

原因是当您插入时,您会将 Unicode (nvarchar(xx)) 字符串转换为 varbinary。然后,当您选择时,您将转换为 varchar(xx)。如果你转换成 nvarchar(xx) 就可以了。

例如:

  • 插入“这是一个测试”作为 varbinary(30) 会导致 0x7468697320697320612074657374。

  • 插入 N'this is a test' 作为 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

这也是

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

【讨论】:

  • @ClaytonHunt 好吧,也许情况正好相反,但几乎可以肯定是 varchar/nvarchar 不匹配。
  • 如果我没有做错 CONVERT,我认为问题出在 NLog 某处
  • 我的立场是正确的,您先生是正确的。这是魔法。谢谢 不要以为你知道如何让 NLog 使用 VARCHAR?
  • @ClaytonHunt:不,抱歉,我从未使用过 NLog。
猜你喜欢
  • 2018-09-14
  • 1970-01-01
  • 2012-12-18
  • 1970-01-01
  • 2011-06-24
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
相关资源
最近更新 更多