Filed Under (MySQL) by a-wei on 31-03-2006

相信 MySQL 的編碼對很多人來說 … 一直是個相當令人頭痛的問題 … 今天所要做的介紹是如何把資料庫的資料, 由 latin1 轉成 utf8..

一般 .. MySQL 裝起來後(用 rpm 安裝) ,系統的預設編碼是 latin1.

而很多人在安裝一些網頁的系統時,如 wordpress、LifeType、phpBB … 等等,都會選擇 utf8 。

這時 … 系統一樣可以正常運作 … 只是當用 phpmyadmin 進入管理資料庫時,就會發現 .. 怎麼中文字的部分都變成了歪七扭八 ..

或者一些鬼畫符的文字。如:凡事先從工作講起

此現象就是 utf8 的文字以 latin1形式儲存,phpmyadmin 以 utf8 的資料讀取方式讀取 … 讀出來的資料就是這種鬼畫符…><。

若要解決 phpmyadmin 讀出的鬼畫符 ... 有兩個方法:

1. 進入 phpmyadmin 內一個名為 libraries 的子目錄 .. 編輯 select_lang.lib.php. 找到 $mysql_charset_map 這一段下方 ..

'utf-8' => ‘utf8′,
把它改成

‘utf-8′ => ‘latin1′,

然後存檔 … 這時候就可以發現原先的鬼畫符 … 這時候又都正常了.

2. 把資料庫的編碼轉成 utf8 …

步驟:

a. 把資料庫 dump 出來

mysqldump -u xxx -p database > database.sql –default-character-set=latin1

這時候 dump 出來的 database.sql 是 latin1 的檔案格式,然而是 utf8 的文字資料,因此這時若用 vi 開檔看它 …

還是會發現中文字是鬼畫符 … 這時不要被眼前的假象所騙 … 以為自己做錯 .. 幾接著做下一步驟。

b. 把 dump 出來的 database.sql 下載回去 .. 用 emEditor(網路上可免費下載,是個支援 utf-8 的編輯器)把 database.sql 打開,

它可以正常識別 utf8 的文字 ..用取代的功能,把 latin1 都取代成 utf8 ,之後直接另存新檔 .. 這時把檔案類型設定儲存成 UTF-8。

c. 再把 database-utf8.sql 上傳到 server .. 這時我們用 vi 開啟它 .. 就可以看見是正常的中文字 .. 這就表示檔案沒問題囉。

d. 把檔案匯入資料庫

mysql database < database-utf8.sql -u xxx -p –default-character-set=utf8
如果資料量不是很大 … 那麼很快就可以完成這個步驟 .. 這時候若沒有錯誤訊息出現 .. 那麼恭喜你 ..

你已經完成了資料庫轉換的工作了。如果有錯誤訊息出現 .. 主要有兩個情形 ..

1. 文件檔內的中文字,用 vi 看是亂碼 ..文件檔的格式不是 utf-8。

2. 匯入的時候漏掉指定採用 utf8 的資料編碼匯入。

以上的作業是在 資料庫系統都是處於 latin1 的環境底下,也就是沒有在 my.cnf 指定 default-character-set=utf8。



Comments:
27 Comments posted on "MySQL latin1 轉 utf8"
Yong-jhih Chen on 七月 9th, 2007 at 8:50 pm #

vi 如果猜不出來就會用預設編碼觀看, 如果你知道是用什麼編碼了話, 改變檢視編碼就好. set encoding=utf-8


help on 九月 7th, 2007 at 8:43 am #

我備份出黎的 *.sql 裏面沒有出現任何 latin1 字眼


部落格系統管理 on 十月 11th, 2007 at 1:07 pm #

MySQL latin1 轉 utf8…

由於要幫忙維護某個私人社團網站,學弟明明告訴我是UTF-8編碼,但在使用PHPMyAdmin瀏覽資料表內容時,卻是一片亂碼。這個問題困擾我很久,終於因為下面這篇文章搞清楚了:原來學弟架的網…


不常识 on 一月 31st, 2008 at 1:14 pm #

博主你好!经人指点来到这里,“. 進入 phpmyadmin 內一個名為 libraries 的子目錄 .. 編輯 select_lang.lib.php. 找到 $mysql_charset_map ”这步走不通。

emEditor就是打开再另存,覆盖一次还是乱码。

请博主指点,怎样改变源sql文件的编码呢?


a-wei on 二月 1st, 2008 at 11:22 am #

回覆:不常识

1.確認一下你的 mysql 的版本跟組態設定, 先進入 mysql console.
輸入 show variables; 然後按 enter.

2. 檢查一下 character_set_ 開頭的,目前是使用什麼編碼。

3. 你是想如何轉碼? latin -> UTF-8 , or UTF-8 -> latin?
phpMyAdmin 預設是 UTF-8.
mysql 預設是 latin.


不常识 on 二月 1st, 2008 at 12:55 pm #

非常感谢博主的回复!详细情形我在你的Contact页留言了,可能的话可以用邮箱请教吗?当然博主也可以在这个页面回复。再次感谢博主!


a-wei on 二月 1st, 2008 at 1:53 pm #

我的 E-mail: a-wei@a-wei.net ^^


不常识 on 二月 1st, 2008 at 2:08 pm #

郵箱在自己網站呢^_^我已經發郵件了,請博主查收。


a-wei on 二月 1st, 2008 at 2:44 pm #

發現 … 你的問題 … 跟這篇文章描述的一樣阿 .

你再參考這篇 http://a-wei.net/archives/77 .. 檢查 mysql 的編碼設定


不常识 on 二月 1st, 2008 at 3:35 pm #

我的權限只能進數據庫,所以那些改其他東西的方法大概不適用了。

我的數據表沒有“| character_set_client | utf8 |”的語句,或者博主要不要看看我的數據表,我先發去你郵箱了,請查收。


a-wei on 二月 1st, 2008 at 5:18 pm #

你的資料檔我看過了,你並不是照我上方的步驟進行。
1. 你是使用 phpMyadmin 備份,而非 mysqldump。phpMyadmin 備份的資料,是使用 utf-8 編碼。

按照上方的步驟做一次吧!


不常识 on 二月 1st, 2008 at 9:40 pm #

是用方法2吧。很抱歉地我是mysql小白,連語句怎樣執行都不清楚。

“a. 把資料庫 dump 出來

mysqldump -u xxx -p database > database.sql –default-character-set=latin1”

可否請博主較詳細地說說在哪裡輸入這句子?拜謝!


不常识 on 二月 1st, 2008 at 9:51 pm #

在SQL處填那個語句嗎?我換了幾種填法還是執行錯誤,請博主指點。


a-wei on 二月 1st, 2008 at 10:05 pm #

舉例:

server]$ mysqldump -u 「mysql-user」 -p 「database」 > database.sql –default-character-set=latin1

然後按下 enter
在輸入命令時的引號部份「」 可省略,這裡只是要標示出來讓你注意的地方。


不常识 on 二月 1st, 2008 at 10:24 pm #

這樣嗎?mysqldump -u -p > database.sql –default-character-set=latin1 不過錯誤。

在引號處填上東西還是錯誤。前面的 server]$ 是怎么回事?


a-wei on 二月 1st, 2008 at 10:31 pm #

不好意思 … 可能是我「語意」錯誤 .

mysqldum -u 「mysql-user」

-u 的意思是要你指定一個 mysql-user 帳號,我原先省略「」的意思是不要輸入引號。 =.=
-p 的意思是要做密碼驗證,建議你先從網上搜尋一些跟 mysqldump 的用法。


不常识 on 二月 1st, 2008 at 11:09 pm #

請博主明示,我的確有查過方法的了,但仍然百試百錯- -|||
比如說數據庫用戶名是ab 密碼是cd 數據庫名是ef,那要輸入的是否為:
mysqldump -u ab -p ef > database.sql –default-character-set=latin1
另外,空格問題需要注意嗎?


a-wei on 二月 2nd, 2008 at 3:41 am #

正確語法應該是這樣 ..
mysqldump -u ab -p ef > database.sql –-default-character-set=latin1


不常识 on 二月 2nd, 2008 at 10:11 am #

博主,還是錯誤呢。有個不情之請,發了郵件給博主,請查收。


a-wei on 二月 2nd, 2008 at 3:48 pm #

你好,
我上去看了,是個 phpMyAdmin 的管理介面,這是代管系統嗎?
mysql 預設的編碼是 latin1_swedish_ci.

因此建議你,直接修改 phpMyAdmin 的預設編碼,改成 latin1。
而不要修改資料庫編碼。

因為即使你修改了資料庫編碼,但資料庫連線的編碼還是會使用 latin1.
到時你會落的兩邊都不是。

mysql 資料庫的編碼系統有三種類型。
1. 前端資料編碼 (網頁)
2. 資料庫連線編碼(網頁與資料庫的連線)
3. 資料庫儲存編碼(把資料儲存在資料庫內的編碼)

你現在的情況應該是這樣.
1. utf-8
2. latin1
3. utf8

前端資料是 utf-8 的編碼,但是在資料庫連線建立後轉成了 latin1 ,再儲存在 utf8 的資料庫內,因此存在 utf8資料庫內的「資料」是 latin1 編碼,而不是 utf8。

phpMyadmin 的管理程式的設定值是這樣

1. utf-8
2. utf8
3. don’t care
這也就是我前面所說得第一個方法,改 phpMyadmin 的編碼,指的就是改第2項。

要把第2項也改成 utf8 編碼的話,必需要在程式內 mysql_connect() 之後接著下這個命令「@mysql_query(’SET NAMES UTF8′)」
這是在你無法變更 mysql 系統的預設編碼狀態下,唯一能夠使用的方法。
也就是說,到時你要更改你 blog 系統內的資料庫連線,把這段程式碼加上去,才能完整的使用 utf8。

但是 … 如果現在就貿然的把 wordpress 資料庫連線編碼變更,新寫入的資料在phpMyadmin 會看的見正常編碼,但是舊的還是「亂碼」 ?

這也就是為什麼我會說,要先把資料庫的資料轉碼。
而轉碼的方法就是 telnet 或 ssh 到 server.. 直接下命令把資料庫 dump 出來,
轉碼之後再回存資料庫。

之後編輯 wordpress 目錄內的 wp-include\wp-db.php 這個檔案。
找到「
$this->dbh = @mysql_connect($dbhost, $dbuser, $dbpassword);」
在它下方加入這一行 ..
@mysql_query(”SET NAMES UTF8″);

然後儲存。
以上的程序可能很繁瑣,建議你比較簡單的方式是 wordpress 資料庫刪除重建,重新開始。
先把這行修正資料庫連線的語法加進去,就不用理會轉碼了。

case close.


不常识 on 二月 2nd, 2008 at 4:24 pm #

刷新頁面時傻眼了,博主竟然打這么長篇!實在感激!

“這是代管系統嗎?”——因為兩岸用語不太一樣,我不清楚這算不算代管系統,反正是dreamhost的數據庫。

在“要把第2項也改成 utf8 編碼的話”之前的都看得很明白,之後的要再揣摩一下。

“「@mysql_query(’SET NAMES UTF8′)」”是在SQL處下命令還是在博客程序中添加語句?

下面的“但是”,是叫我不要這樣做嗎?

“而轉碼的方法就是 telnet 或 ssh 到 server”這句不太理解,是按照那語句嗎?但總是錯誤的……?

“wordpress 資料庫刪除重建”,我就是要在新的數據庫上建博客,是這個意思?

博主已經這么詳細解釋,腦子不好是我的錯,還請博主解答疑難。謝謝!


不常识 on 二月 2nd, 2008 at 6:30 pm #

在我的wp-db.php里,只有“return $this->__construct($dbuser, $dbpassword, $dbname, $dbhost);”一句,在下面添加“@mysql_query(”SET NAMES UTF8″);”之後出錯。

另外,現在我的博客已經建在新的dh主機上了,所以說數據庫和之前的是一樣的,查看亂碼的樣子也是一樣的,是不是說這兩個數據庫還有一點關鍵差別?


不常识 on 二月 2nd, 2008 at 8:37 pm #

“$this->dbh = @mysql_connect($dbhost, $dbuser, $dbpassword);”這句的話我在wp2.32處找到,也上傳去了,結果也是數據庫錯誤。

查資料用“ALTER DATABASE `test` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin ”來改還是不行。


不常识 on 二月 2nd, 2008 at 8:51 pm #

查了一下編碼,不知對問題解決有沒有幫助。
Variable_name Value
character_set_client utf8
character_set_connection utf8
character_set_database utf8
character_set_filesystem binary
character_set_results utf8
character_set_server latin1
character_set_system utf8
character_sets_dir /data/mysql/epel/share/mysql/charsets/


不常识 on 二月 4th, 2008 at 6:25 pm #

請問博主是要判這個數據庫死刑嗎?問題現在還沒有解決,博主對我後加的問題有什麽建議嗎?


不常识 on 二月 4th, 2008 at 8:23 pm #

非常感謝博主的郵件,因為我的wp是2.2的,要用2.3的話就要刪除現有的系統再上傳新版wp,馬上就試,希望成功~~~


不常识 on 二月 4th, 2008 at 9:22 pm #

非常遺骸地,還是錯誤了……博主說那時最後能幫我的了,判死刑了啊~~我也不能再說什麽了,可否請博主最後幫一次,我實在搞不懂我為什麽不能用mysqldump的語句,照博主前面的所言這條路還是有希望的,我再別處也問了人但還是不斷的錯誤,可否請博主最後指點,謝謝!


Post a comment

Name: 
Email: 
URL: 
Comments: