2013年11月6日 星期三

使用MySQL做base64解碼解決izpack中文字變亂碼問題

最近用了一個叫 izpack 的套件製作我們軟體的安裝程式,

安裝過程中有一個步驟是讓程式執行一段SQL指令初始化資料庫,

SQL中包含了中文字資料,

但只要透過安裝程式執行這段SQL,原本好好的中文字都會變成問號,

測來測去覺得應該不是我的問題,問題可能出在 izpack 的某個環節中,

因此想了一個辦法繞道走,


也就是透過編碼的方式把中文字編成英數字元,

使SQL中沒有中文字,自然就不會變成問號,

所以就去查了MySQL有沒有把文字編碼的方法,果然有!

TO_BASE64(str)FROM_BASE64(str),立馬測試,結果──登愣──失敗,

因為這兩個Function是5.6版以上的MySQL才提供,我們的版本不支援,


還好,早就有網路神人用MySQL的語法就寫出了Base64編碼和解碼的Function,

只要把這兩個Function和對應表的table建進資料庫裡 (建構的SQL在此),

我們就能在舊版本的MySQL內使用Base64啦,太神奇了,


建好Function之後我們的工具就準備齊全了,

最後的解法如下,假設原本有問題的中文字SQL語句是

INSERT INTO `my_table` VALUES ("松鼠的樹洞2.0")
我們利用Base64 Encode算出這段文字的編碼結果為

5p2+6byg55qE5qi55rSeMi4w
所以就可以改寫SQL語法為

INSERT INTO `my_table` VALUES (
    CAST( base64_decode('5p2+6byg55qE5qi55rSeMi4w')
        AS CHAR(10000) CHARACTER SET UTF8)
)

那一串cast是做轉型,因為decode出來的回傳型態是BLOB,

重點是在於我們把 "松鼠的樹洞2.0" 這串文字轉成Base64,再透過解碼還原,

所以雖然一樣是寫入中文字到DB內,但SQL中不會出現任何的中文字,

自然就能避免掉程式載入SQL時中文變成亂碼的問題。


一天又平安的度過了,謝謝Base64的幫忙 ^^

沒有留言:

張貼留言