先看看這個,裡面提到重要的一點,有 SUPER 權限的 user 在連線的時候不會去執行 init_connect 。這好像說明了很多人為什麼都要在連線後自己加上 ‘SET NAMES UTF8′ 了。
根據實驗結果,如果你像我一樣,在很久以前(大概在 mysql 3.x 的時期)就開始將:
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 化邁進啦。
- 上面說過囉,具有 SUPER 權限的人,加在 my.cnf 是沒用的[back]
剛試了一下,果然改用別的 user 連線,就正常了。
我上週才為了這個搞的半死,前因後果是這樣的(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)
啊, 原來有 DB Cache, 怪不得我在 gallery2 上測試會覺得怪怪的…哈哈…..
MySQL 有什麼不好嗎?換 pgsql 幹嘛?
MySQL的語系問題還蠻討厭的:p
我加在 /etc/make.conf 後還沒有壞過的 :p
我也是加在/etc/make.conf,之前沒有加的就dump出來,mysql重編之後再倒回去。
[...] [encoding] MySQL 4.1.x SET NAMES UTF8 [...]
[...] 3. DB使用經驗 http://blog.dragon2.net/archives/2005/10/24/228.php [...]
WordPress 安裝參考-編碼…
延續之前的《WordPress 安裝資料庫小注意》
好一陣子沒有裝 WordPress ,試了一下 2.0.1 ,安裝步驟還是很快,不過資料庫編碼的問題還是有。之前提到:
安裝 WordPress 之前修改 wp-includes/wp-db.php…
[...] clsung這邊看來的 [...]
我还是没能解决,因为我是用虚拟主机,没有操作权限!
这样要如何实现呢
现在读出来是正常,数据库里显示乱码?
你有對 Database 的存取權限嗎?有的就先 dump database ,轉換後再塞回去吧…
[...] 完成:把 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] [...]
[Note] 4.11 -> 6.1-R…
過了幾天,系統應該是沒什麼問題了,來加點註記:
MySQL 4.1.X 重編之後 blog 變成亂碼,在 make.conf 依然有如這篇的選項。最後只好先 dirty hack 在 wp-include/wp-db.php 中的 function wpdb 裡加上
$this-&g…
[...] [encoding] MySQL 4.1.x SET NAMES UTF8 [...]
[...] MySQL 4.1.x SET NAMES UTF8 [...]