[encoding] MySQL 4.1.x SET NAMES UTF8

先看看這個,裡面提到重要的一點,有 SUPER 權限的 user 在連線的時候不會去執行 init_connect 。這好像說明了很多人為什麼都要在連線後自己加上 ‘SET NAMES UTF8′ 了。

根據實驗結果,如果你像我一樣,在很久以前(大概在 mysql 3.x 的時期)就開始將:

WITH_CHARSET=utf8
WITH_XCHARSET=complex

放在心上,啊不,是放在 /etc/make.conf (還在用 linux 嗎?趕快換 FreeBSD 吧)裡。那麼你應該都不會出現各家長輩們哀嚎的畫面。

不過很不幸地,在某一台上,我忘了做這件事,所以被 mysql 狠狠地修理了好幾天。事情緣起於我想把 blog 系統由 plog 換成 wordpress,沒想到由 f0rth 寫的 plog2wp.rb 竟然跑出亂碼來,明明在資料庫裡,怎麼看都是 utf8 ,連 mysqldump 也是 utf8,但只要由程式去連線,就死了。(奇怪,上面的網頁明明寫說 root 連線不執行 ini_connect,為什麼 mysqldump 出來是正確的?啊 ruby 等 client 連線就是錯的?)

這裡還有一點要先提。不管資料庫裡面的實際儲存 encoding 為何(可以用 vim 去直接讀資料庫檔案看看),在網頁上各個資料庫呈現的文字都是漂亮的 utf8 ,但若是用 phpMyAdmin 進去看,會發現有的根本不是 utf8 。而唯一是 utf8 的 plog db,用 ruby 去 select (我猜 perl 的也一樣啦)出來卻是亂碼。

最後在一連串的亂七八糟 encoding conversion 測試之後,得出一個結論,至少對我有用。對於你確定是以 utf8 存的資料庫,在 connect 之後加 ’set names utf8′ 準沒錯(1),而對於可能是以 latin1或big5 格式存 utf8 資料的資料庫(很繞口),就分別用 ’set names latin1/big5′ 來做連線看看,目前為止幾乎都是準的,唯一的例外是我的 gallery2 系統,目前要看到部份中文字要先 ’set names latin1′ 然後將 dump 出來的資料由 encoding utf8 轉為 encoding big5 。而另一部份的中文,則要由 encoding latin1(cp950)轉為 big5。

簡直一團糟!!!

下一步,就是朝全面 utf8 化邁進啦。

Share and Enjoy: These icons link to social bookmarking sites where readers can share and discover new web pages.
  • Digg
  • Sphinn
  • del.icio.us
  • Facebook
  • Mixx
  • Google
  • funp
  • Haohao
  • Hemidemi
  • Live
  • MisterWong
  • TwitThis
  • udn
  1. 上面說過囉,具有 SUPER 權限的人,加在 my.cnf 是沒用的[back]
 

8 replies


  1. 剛試了一下,果然改用別的 user 連線,就正常了。


  2. 我上週才為了這個搞的半死,前因後果是這樣的(MySQL 5.0.11)
    本來在my.cnf有加init_connect=”SET NAMES utf8″,後來不知道為什麼拿掉了,然後Gallery2就開始一堆亂碼跑出來(????這種的)。
    一樣是把資料倒出來,確定是utf-8,然後嘗試新建一個Gallery2,居然資料寫到db是utf-8 -_-。搞了半天才找到”可能要加SET NAMES utf8″,why?,因為我直接在亂碼的gallery2上面隨便弄個中文,居然網頁可以正確顯示,去MySQL再看了一下,寫進去的資料居然是latin1字集,啊明明那個table就是unicode啊。

    最後把init_connect=”SET NAMES utf8″加回去,進到亂碼的gallery2,清掉DB cache後就正常了。

    (其實很想把Gallery2的MySQL轉到PostgreSQL…但目前還找不到快速轉換的方法:p)


  3. 啊, 原來有 DB Cache, 怪不得我在 gallery2 上測試會覺得怪怪的…哈哈…..
    MySQL 有什麼不好嗎?換 pgsql 幹嘛?


  4. MySQL的語系問題還蠻討厭的:p


  5. 我加在 /etc/make.conf 後還沒有壞過的 :p


  6. 我也是加在/etc/make.conf,之前沒有加的就dump出來,mysql重編之後再倒回去。


  7. 我还是没能解决,因为我是用虚拟主机,没有操作权限!
    这样要如何实现呢
    现在读出来是正常,数据库里显示乱码?


  8. 你有對 Database 的存取權限嗎?有的就先 dump database ,轉換後再塞回去吧…

8 trackbacks

Leave a reply

Creative Commons Attribution-NonCommercial-ShareAlike 2.5 Taiwan
Creative Commons Attribution-NonCommercial-ShareAlike 2.5 Taiwan