[encoding] MySQL 4.1.x SET NAMES UTF8

2005/10/24
By

先看看這個,裡面提到重要的一點,有 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 化邁進啦。

  1. 上面說過囉,具有 SUPER 權限的人,加在 my.cnf 是沒用的[back]

16 Responses to [encoding] MySQL 4.1.x SET NAMES UTF8

  1. clsung on 2005/10/24 at 5:06 下午

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

  2. ychsiao on 2005/10/25 at 10:44 下午

    我上週才為了這個搞的半死,前因後果是這樣的(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. clsung on 2005/10/25 at 11:40 下午

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

  4. ychsiao on 2005/10/26 at 1:23 上午

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

  5. clsung on 2005/10/26 at 9:40 上午

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

  6. Forth on 2005/10/30 at 1:01 上午

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

  7. [...] [encoding] MySQL 4.1.x SET NAMES UTF8 [...]

  8. Kirin Lin on 2006/03/02 at 2:53 下午

    WordPress 安裝參考-編碼…

    延續之前的《WordPress 安裝資料庫小注意》
    好一陣子沒有裝 WordPress ,試了一下 2.0.1 ,安裝步驟還是很快,不過資料庫編碼的問題還是有。之前提到:
    安裝 WordPress 之前修改 wp-includes/wp-db.php…

  9. [...] clsung這邊看來的 [...]

  10. calmLife on 2006/04/01 at 12:19 下午

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

  11. clsung on 2006/04/05 at 10:39 下午

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

  12. [...] 完成:把 MySQL 裡的資料庫換成 UTF-8。參考:如何修正 MySQL 資料庫的 encoding [Jeffhuang.idv.tw]、MySQL 4.1.x SET NAMES UTF8 [blog.dragon2.net]、wordpress 1.5 升級注意事項──中文亂碼篇 [ria.richtechmedia.com]、mysql 4.1 中文亂碼第二擊 [ria.richtechmedia.com] [...]

  13. Hi! I'm clsung on 2006/10/16 at 9:35 上午

    [Note] 4.11 -> 6.1-R…

    過了幾天,系統應該是沒什麼問題了,來加點註記:

    MySQL 4.1.X 重編之後 blog 變成亂碼,在 make.conf 依然有如這篇的選項。最後只好先 dirty hack 在 wp-include/wp-db.php 中的 function wpdb 裡加上

    $this-&g…

  14. [...] [encoding] MySQL 4.1.x SET NAMES UTF8 [...]

  15. [...] MySQL 4.1.x SET NAMES UTF8 [...]

發表迴響

您的電子郵件位址並不會被公開。 必要欄位標記為 *

*


*