至今才恍然大悟...
起初
我們的網頁資料是透過PIG跑hadoop map reduce job得到結果並存在HDFS上
再透過sqoop export至mysql
最後display到網頁
然而資料中city值卻會出現亂碼
因此我們認為在PIG call UDF時得到的的資料就不是UTF-8的編碼
導致最後呈現在UTF-8網頁上會有問題
[Solution1]
改UDF,將回傳值convert至UTF-8
然而發現JAVA本身就是Unicode
這樣回傳回來的應該沒問題阿!!
後來發現原來我們的MySQL character set都是latin1
所以是不是因為將UTF-8值塞入至latin1造成亂碼呢
[Solution2]
將Column編碼改成UTF-8
並將原本存的值CONVERT成UTF-8看是否會正常顯示
結果還是失敗= =
跟據了解MySQL存值是Binary Safe的
所以設定column的編碼只是告訴他用什麼碼來解讀
因此所存的值應該是沒有問題
那到底問題在哪呢
只剩下取值階段解譯錯了
所以進到MYSQL調整client,connection,results的字集設定
mysql > set character_set_client =utf8
mysql > set character_set_connection =utf8
mysql > set character_set_results =utf8
mysql > show variables like 'char%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
這樣行了吧
結果卻是無奈
幾番排列組合後結果依然沒有進展
後來從新連入後才發現!!
這些值無法on the fly 改變
所以...
[Solution 3] !!!正解阿!!!
edit /etc/my.cnf 加入下面的設定,並RESTART MYSQL
[mysqld] # character-set-server=utf8 # collation-server=utf8_general_ci init-connect='SET NAMES utf8' [client] default-character-set=utf8
service mysqld restart
哦~~資料庫都不用動,讀出來的資料都頭好壯壯啦!!!
為了這件是蠢了兩天XD
UPDATE:
不想改資料庫設定的話
也可以從程式下手,在query前先下SET CHARACTER_SET_RESULTS=utf8即可
沒有留言:
張貼留言