我曾經也曾為數據字符串的編碼問題苦惱過,特別是當出現分號,或者漢字等非ASCII碼的字符時候。經常因為數據庫編碼問題導致亂碼,甚至導致無法插入的錯誤,然后各種找問題。我計划在這周寫一篇關於編碼的blog,詳細介紹編碼有關的知識,這兒就不多贅述了。如何才能避免上述問題,而且做到一勞永逸呢?辦法非常簡單,只需要多做一步的工作。這一步工作就是先把字符串轉換成Base64編碼格式,然后將轉換后的字符寫入數據庫。讀取的時候再對字符串進行Base64解碼,就可以避免亂碼和特殊符號的騷擾了。下面我簡要說下為什么通過Base64可以解決數據庫亂碼和特殊字符的困擾。
首先Base64中只包含基本字母外加“+”和“/”。其中沒有任何其他有特殊含義的符號,所以,Base64肯定不會帶來特殊符號的困擾。而至於為什么能避免亂碼問題,原因也非常簡單。亂碼是由於對於數據解析成相應字符出錯導致的。這也就是說,出現亂碼的時候,如果在Byte層面去看數據的話,其實數據是沒有錯的,而錯誤關鍵在與對於byte轉換成相應的字符時出了問題。既然容易出問題,那我們為什么還有進行轉換呢?因為各種軟件應用編碼是不統一的,例如不同數據庫默認的編碼格式就不同。那么在指間進行傳輸字符數據,肯定要進行解碼編碼。而如果使用Base64就可以解決這個麻煩,因為所以軟件應用都會支持ASCII的,而Base64是ASCII的子集,所以肯定也會支持,那么在傳遞字符數據的時候,就無需進行數據編碼轉換了。我也見過直接用Byte存儲的,因為無論哪種編碼,在Byte層都是一樣的數據。這種方法的確可以,但是這有一個缺點。如果數據庫中Field的Type是字符串之類的類型。通過Byte的編碼是非常浪費存儲空間的,因為一個Byte數據可能需要幾個Byte的字符數據才能表示(這兒不同數據庫處理應該不同,SQLite應該就是把Byte類型數據直接轉換成相應的字符存到數據庫的。這兒就又需要考慮太多了的情況了)。根據我個人習慣Base64比其他方法都要優秀,因為無需考慮任何其他外界條件。但然可能存在其他我不知道的優秀方法,如果遇到我會繼續更新,也希望有優秀方法的大牛們多多指點。利用中午一點休息時間寫了這么一篇小Blog,就先到這里。