今天一時興起,玩起 UTF-8 的 Terminal 環境,搭配 screen 還頗好用,要用 big5 還是 utf-8 都可以切換‧玩到最後,一不做二不休,跟 denir 大大討論了一下,決定把豬公村也給 UTF-8 化...
新版的 phpBB2 已經有 UTF-8 的介面了,這個是沒啥問題 (雖然說我到最後還是沒抓到最新的語系檔,拿原本 big5 的轉了過去用)‧最大的問題出在原本 mysql 的資料庫是以 big5 去儲存的,這個比較慘‧
剛開始用了最白癡的方法: 用 mysqldump 把資料 dump 出來,用 iconv 轉完再塞回去,結果當然是失敗‧因為 big5 被 mysqldump 丟出來時,許功蓋會被轉換成許\功\蓋\,SQL query 就會變成這樣: insert into table values ('許\功\蓋\'); 聰明的你一定看的出來,這個 query 一定會死在 \' 那邊‧所以此招可以填海‧
吃完宵夜之後,回家再戰‧這次用的方法如下,這個就可行了,所以筆記一下給大家:
假設我們要轉換的 table 是 phpbb_posts_text
1.把 table 內容用 select into file 的方式丟出來: select * from phpbb_posts_text into outfile '/tmp/phpbb_posts_text'
2.進行轉碼: iconv -c -f big-5 -t utf-8 /tmp/phpbb_posts_text > /tmp/phpbb_posts_text.utf8
3.把原本 table 的東西清光準備塞新資料: delete from phpbb_posts_text where 1;
4.將 utf-8 的新內容丟回去: load data infile '/tmp/phpbb_posts_text.utf8' into table phpbb_posts_text;
然後每個含有 big5 資料的 table 都要做一次,所以聰明的小孩一定會用 script 來完成的 :)
由 cclien 發表於 November 3, 2005 05:45 AMhow about truncate phpbb_posts_text ?
Posted by: 路人 發表於 November 3, 2005 06:05 PM安..我的mysql語系應該是big5的(我用戰國策的虛擬主機空間)
我一直有個疑問..我用phpmyadmin把資料表dump出來後
打開它的內容,也是insert into table values ('許\功\蓋\'); 的情形,可是神奇的是...我再把他匯回原來的mysql(big5),它是可以正常匯入的。
這是為什麼呢??
Posted by: axis 發表於 February 14, 2006 03:30 PMbig5 匯出再以 big5 匯入不會有甚麼大問題
主要是 big5 碼有些字會用到 "\" 字元,這個東西剛好是 mysql 的 escape character,好比說 \n 代表換行 \t 代表 tab 之類的‧如果要正確輸入 "\" 符號,應該使用 "\\" 而不是 "\"
可以找一個可以編輯十六進位的 editor 觀察看看,會發現下列東西:
1) \ 的 ascii 是 0x5c
2) big5 的許剛好是 0xb3 0x5c,其實後半部是一個 "\"
所以要正確在 mysql statement 裡輸入許必須再補一個 "\",因此才會有"許\功\蓋\"這種東西出現
我表達能力不好,語焉不詳請多包含啊
呵呵,其實許功蓋的問題我已經在舊版的mysql4.0.x完全解決了,舊版的語系預設是latin1,dump或存入資料表都不會有問題。本來以為連許功概都不是對手,這樣就天下太平。沒想到,最近申請了新的虛擬主機,mysql是4.1.x版的,支援多國語系編碼,網路上大部份的文章都是教如何把舊版的latin1編碼資料轉成utf8到新版的mysql上。
假設我的舊網站程式檔有1000個,用converzt轉成utf8,沒問題,但是所有程式都有對許功蓋做addslash或stripslash的動作,要全部去修改,不太可能吧。所以不得已就不能用utf8了,還是要在新版mysql用latin1編碼,先將mysql的環境設定成latin1,匯入時編碼選項選latin1即可成功匯入,看似天下又再度太平了~~~
實則不然,以後要轉移資料庫時會不會遇到問題?ok先把資料表用phpmyadmin(虛擬主機只能這樣做)dump出來,打開.sql一看,所有中文都變成亂碼,再匯回去,果然失敗。
所以我的問題就是,如果一定要在新版mysql4.1.x上用latin1,要如何備份資料庫才不會出錯呢?
Posted by: axis 發表於 February 17, 2006 08:17 AM嗯... 我的也是 mysql 4.1 耶
之前做這些動作的時候沒想到新版支援雙字元 encoding 的問題,所以還是當作舊的用,default encoding 是 latin1‧我一直都用 mysqldump 在處理,都沒遇到問題
不過剛剛聽你說之後裝了 phpmyadmin 來玩玩看,結果真的如你說的一樣出來一堆亂碼,感覺是 phpmyadmin 帶塞
找了一下資料,要嘛修改新版 phpmyadmin 的 mysql client charset,要嘛裝舊的 (我試了 2.5.6),就可以順利 dump 出來了
不過 insert 我沒試過,你再試試看囉
Posted by: cclien 發表於 February 17, 2006 09:28 AM疑,你不是已經改用utf8了,那怎麼mysql語系還是用latin1呢?
mysql4.0時,那時是把utf8存到latin1的mysql裡,表面上看來沒有問題,但是當要升級到4.1時,網路上的文章說會有問題,因為以前雖能用,但不是真正的utf8,只是碰巧latin1也可以處理大多數的utf8字元,所以相安無事
到了4.1,當你想用真正的純UTF8時,把4.0DUMP出來的資料匯進去一定失敗,要處理過才行。你可能在4.1上面設LATIN1,所以可以匯入成功,但是這仍然不是真正的UTF8。
所以我猜:
1.現在可以DUMP出來資料,但匯回去時會失敗
2.在網路上的一些UTF8版開放軟體,可能無法安裝,因為這些
軟體都是把UTF8的文字寫入UTF8的資料庫中,而你還是用LATIN1,所以硬寫進去會出問題
3.未來可能預到的問題是,假設有一天你要把BLOG轉到另一台主機上,該台主機內已有其他UTF8的程式,資料庫也是用UTF8,
那該會轉不過去的,畢竟你用的是LATIN1的UTF8,不是真正的UTF8
哈 將就著用咩,其實我的主要目的是能以 utf-8 顯示而已
DB 的 charset 感覺是沒甚麼差,反正 php 裡面也是以類 latin1 的方式處理
有空再來轉成正 utf-8 XD
Posted by: cclien 發表於 February 17, 2006 05:43 PM呵~~因為你的blog是私人站,所以影響不大。但是我是要幫客戶做的,不能不考慮日後備份和回存的問題。
應該有不少人也是把舊mysql4.0(用latin1的utf8)的資料表匯到mysql4.1(也是用latin1的utf8),而且這一部份剛好也不會有問題,在網路上也看不到這類問題的發問。
暫時不會有問題,但是有一天要改變環境時,才會發現怎麼都是utf8,就是匯不進去呢???所以目前暫時都是天下太平的。
私人站居多,所以~~匯入失敗,其實也是沒什麼關係,大不了關站 lol
Posted by: axis 發表於 February 17, 2006 08:26 PM找到原因了,只要在mysql4.1上用phpmyadmin匯出資料表,他會強迫用utf8匯出,並破壞原本的中文字。
而你是用mysqlsump,可以自行選擇匯出編碼,所以對你來說沒有影響
Posted by: axis 發表於 February 20, 2006 02:36 PM我用 phpmyadmin 還不是倒的好好的, zz
Posted by: cclien 發表於 February 21, 2006 08:40 PM終於都看到關於 phpBB UTF-8 化的 Post 了~!
連日來,我不停的把 databse dump 出來,給那些 escape character 弄得頭昏腦脹,可以講講怎樣才可以寫個 Script 去做轉碼嗎?
因為我的討論區是放在虛擬伺服器,只可以以 shell script 做 backup...但是我對 shell script 等一竅不通,慘...
Posted by: 晴朗 發表於 April 13, 2006 03:36 AM你可以先把資料庫倒出來
在別的地方轉完再 insert 回去 :)