2009-11-19 81 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