2009-11-19 68 views
1

我们当前使用SQL发布向导来备份我们的数据库模式和数据,但是我们有一些使用包含空字符(chr(0))的散列密码的数据库表。当SQL发布向导生成插入数据脚本时,当我们尝试并运行生成的SQL时,空字符会导致错误 - 它会在脚本中此角色的第一个实例后忽略ALL TEXT。我们最近试用了RedGate SQL Compare,发现它与这个字符有相同的问题。我通过对违规记录运行ascii()sql函数来确认它是ascii字符代码0。SQL INSERT脚本中Chr(0)的问题

,我们所得到的是错误的样本是:

Unclosed quotation mark after the character string '??`????{??0??? 

有趣的部分是,我真的不能粘贴样品插入语句,因为出现当然一切后,CHR(0)是被粘贴时忽略!

+1

你使用什么哈希算法会产生Chr(0)作为有效的字符?问题出在那里,而不是在INSERT语句中。 Chr(0)一直被用作字符串终结符,这就是为什么没有人会期望它后面有任何东西。您需要更改散列算法。 – 2009-11-19 16:39:56

+0

我同意,但它是散列密码的第三方算法(ASPDotNetStorefront)。我们有许多ASPDNSF网站,我们不能仅仅改变算法,已经有成千上万的客户已经拥有一个哈希密码。我已经向他们提交了更改请求,希望他们删除插入NULL字符的可能性。 – Keith 2009-11-19 17:14:51

回答

1

将该列的定义更改为VARBINARY。您存储在那里的数据似乎不是适合的VARCHAR。

这将影响使用该列的代码,因为您将在客户端获得一个byte [] CLR tpe,并且应该相应地更改插入/更新代码。但毕竟,passowrd散列是一个字节[],而不是字符串。

+0

这听起来像一个可行的解决方案 - 我会研究它,让你知道它是怎么回事。 – Keith 2009-11-19 17:15:21

+0

我只是试过这个,但是由于我们绑定到第三方算法,系统显然吐出了“不能将字节[]转换为字符串”错误。当然,这是在专有的DLL中,我们无法修改源代码。对于不涉及修改核心数据类型的解决方法,您是否有任何建议? – Keith 2009-11-19 17:25:48

+0

您可以使用Encoding.GetString()和Encoding.GetBytes()将字节[]与字符串进行转换。 http://msdn.microsoft.com/en-us/library/system.text.encoding.aspx。另一种方法是Base64对散列进行编码并存储base64,但是正弦它仍然需要从库base64转换为base库,我认为没有varbinary/byte []的好处。 – 2009-11-19 17:34:47