安裝過程中有一個步驟是讓程式執行一段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的幫忙 ^^
沒有留言:
張貼留言