Linux0911 2007-7-28 10:39 AM
【教學】MySQL 4.0 BIG5 to UTF-8
作者:[url=http://linux0911.no-ip.info]Linux0911[/url]
發表日期:2007-7-28 10:39 AM
最後修改:2007-8-17 12:39 AM
轉載請註明來源:[url]http://linux0911.no-ip.info/Discuz/viewthread.php?tid=9122[/url]
昨晚做了個 Discuz! 資料庫由 big5 轉為 utf-8測試
[b]伺服器環境如下:[/b]
Apache 1.3.37
PHP 4.4.7
MySQL 4.0 Standard
phpMyAdmin 2.7.x
Discuz! 5.5.0 BIG5
[b]必須準備的工具:[/b]
UltraEdit
EmEditor
ConvetZ
[font=黑體][size=4][color=Red]請注意:[/color][/size][/font]
當你轉為 utf-8 的時候, 在帖子中的一個中文字元算 3 字元 (意思就是三個英文或數字)
原本 big5 是算 2 字元
所以你有的文章標題剛好滿 27 個中文字就會被截斷 (當你在論壇還是 big5 的時候, 轉為 utf-8 就會被截斷)
[box=Navy][font=標楷體][size=5][color=white]我先解釋我自己電腦測試整個的歷程[/color][/size][/font][/box]
1. 把原論壇的資料用 [b][color=Blue]Discuz! 後台[/color][/b]的部分來備份
[attach]4341[/attach]
不過注意一點, 因為 [b]MySQL 4.0[/b] 含以前的版本並沒有支援 [color=blue]編碼校對[/color] 這東西
強制字元集 (Charset) 只有[color=red]預設[/color]的這個選項, 就是 Big5
2. 備份出來的 [b]xxx.sql[/b] 檔案 (很多分卷) 呢, 先移到其他資料夾 (待會要用)
3. 在建立一個 Discuz! 5.5.0 [b]UTF-8[/b] 版的新論壇 (去 Discuz! 官網下載)
4. 新論壇建立完成後, 將剛剛備份的 [b]xxx.sql[/b] 檔放到 ./forumdata/[b]backup[/b]_torCYI/ 底下
5. 再到 [b]資料恢復[/b] 裡面點選[b]導入[/b], 它會自動導入其他分割的部分 (因為你在備份的時候它會自動切割 [b]2048 kb[/b] 為一卷)
在導入的過程, 可能會出現 [b][color=Red]你無權訪問系統設置[/color][/b]
到首頁重新登錄即可, 但同時, 不要亂動任何部分, 我們現在的焦點都放在後台的部分
6. 導入完成後, 到後台更新論壇統計每一個都按一次, 按完後再按更新快取 (cache)
7. 然後到首頁你會發現所有的文字變成看不懂的蟲型文字
8. 這時候, 到 [b]phpMyAdmin[/b] 底下, 將[b]新論壇的資料庫[/b]裡面的[b]資料表[/b]一個一個導出來, SQL 格式
9. 就在此時, 你每個資料表都導出來後, 用 [color=darkgreen]ConvertZ[/color] 開啟 [b][color=Blue]cdb_xxx.sql[/color][/b] 檔案
[color=Red][size=5]編碼由 Big5 轉到 utf-8[/size][/color]
然後再由 [color=darkgreen]UltraEdit[/color] 開啟 [b][color=Blue]cdb_xxx.sql[/color][/b] 檔案
會有 [b]INSERT INTO[/b]........ 很多行
你就從第一個 [b]INSERT INTO[/b] 開始複製起來 (建議一次 1000 筆資料)
它上面會有結構 CREAT TABLE, 不要理它
從 INSERT 開始才是我們要的部分
這時候將該 [color=Blue]資料表[/color] 用 [b]phpMyAdmin[/b] [b][color=Red]清空[/color][/b]先
[color=Green]每次要INSERT INTO 的 sql 檔都要注意, 資料表要對齊, 不要清錯資料表[/color]
[size=3][color=red]注意:[/size]剛剛複製起來的 1000 筆資料不是到 phpMyAdmin 的 SQL 語法執行
而是在 [size=5]Discuz! 後台的升級資料庫[/size], 執行這 1000 筆資料 [b][color=Blue]cdb_xxx.sql[/color][/b] 檔案
10. 當你要轉換 cdb_members 的時候 [color=Red][size=4](重要! 攸關會員登錄問題)[/size][/color]
請直接到 phpMyAdmin, 選取論壇資料庫內的 cdb_members 資料表
然後選上面的 [color=Red]SQL[/color], [b][color=Green]在資料庫 discuz 執行以下指令:[/color][/b]
[attach]5337[/attach]
如果你的 phpMyAdmin 是 big5, 請使用右鍵將網頁編碼改為 utf-8 之後
再將 cdb_members.sql 內的 INSERT INTO 貼在 [b][color=Green]在資料庫 discuz 執行以下指令:[/color][/b] 裡面
即可從 big5 的 phpMyAdmin 導入 utf-8 編碼的資料
11. 升級成功後, 你將會發現這些看不懂的文字, 看得懂了!
[box=Red][size=7][font=標楷體][b][color=white]請把全文看完幾遍後再操作[/color][/b][/font][/size][/box]
[font=標楷體][size=5][color=blue]但是發現有些問題存在[/color][/size][/font]
a. 從原先舊論壇後台導出的 xxx.sql 檔案, 跟 phpMyAdmin 不太一樣的地方就是他的編碼是 Discuz! 特有的
意思就是必須從 Discuz! 系統才能還原
b. 從 MySQL 4.0 + Discuz! BIG5 版本導出的資料庫, 都會在衝碼字後面加上反斜線, 還有換行也包含在內, 都會加上反斜線
這是蠻麻煩的一件事, 要去掉還真花時間, 如果你的 post 資料超過 1,000,000 比, 可能要花上一整天來改 INSERT INTO 的衝碼字
c. 有時候你的文章出現奇怪的字, 不知道是簡體字 GBK 還是 UTF, 它會破壞原本的資料結構
例如它可能是[code]INSERT INTO cdb_XXX VALUES ('xxx?, '');[/code]這個結構上是無法正常執行的, 如果你眼尖, 可以發現少一個 [size=4][color=red]'[/color][/size]
所以要去找這些問題的存在
改為[code]INSERT INTO cdb_XXX VALUES ('xxx?', '');[/code]才能正常的導回資料庫
[font=標楷體][size=6][color=blue]結論:[/color][/size][/font]
以上這樣子的小型測試, 可能純粹巧合, 不過實驗證實可以成立
可以將 MySQL 4.0 資料庫, Discuz! 論壇編碼由 big5 轉為 utf-8
[font=標楷體][size=5][color=red]善用 EmEditor 來去掉資料庫內的反斜線
它選取衝碼字的時候會有兩個反斜線
你在[b]取代欄位[/b]將該衝碼字後面的兩個反斜線去掉
再進行取代就 ok 了~
[attach]5304[/attach]
像是這樣子就好了
請勿一次全部替換掉所有反斜線[/color][/size][/font]
這樣會破換 Discuz! 資料庫的結構, 所以你在後台升級資料庫的時候, 將錯誤的行數找出來
再去 phpMyAdmin 找到資料庫裡面的資料表 看到哪裡行出錯
再找到 cdb_xxx.sql 檔案找出, 是不是衝碼字, 是不是多了一個反斜線
那再從該行數下繼續 INSERT INTO 下去即可完成
即是善用導入跟導出來解決這個問題, 不過要注意一下 phpMyAdmin 跟 Discuz! 的導入系統
兩個是要相配合, 不是單由一個程式來備份跟還原
[b][size=3]還有很多疏漏的部分, 本人能力有限, 希望有人能幫忙測試結果
一同研究
如果成功轉換為 utf-8 編碼, 那我想在日後的 MySQL 4.1.x ~ 5.x.x 版本資料庫上搬資料
都會輕鬆許多了[/size][/b]
[b][color=green]希望各位在閱讀本文的同時, 能夠幫助您加深理解資料庫的結構, 以及資料庫的邏輯思維
運行方式, 希望對想從 MySQL 4.0 BIG5 轉到 UTF-8 的網友, 有進一步的了解![/color][/b]
capolock 2007-8-28 12:09 PM
我知道AL8一個叫天使的會員
會用這個編碼
但我看了一下
好亂:funk: 看不太懂
Linux0911 2007-8-28 10:44 PM
你的環境如果是 MySQL 4.0 的話可以做測試
如果你需要升級 MySQL 版本的話
freedomman 2007-12-25 01:41 AM
請問這些圖片不能覆制的方法是怎樣做
formyrain 2008-9-15 09:18 PM
我每次都會卡在把會員匯過去後, 他們無論輸入什麼密碼都會說找不到此用戶
就算我在後台更改他們的密碼也沒有用 = =
Linux0911 2008-9-20 02:16 AM
[quote]原帖由 [i]freedomman[/i] 於 2007-12-25 01:41 AM 發表 [url=http://linux0911.no-ip.info/Discuz/redirect.php?goto=findpost&pid=22255&ptid=9122][img]http://linux0911.no-ip.info/Discuz/images/common/back.gif[/img][/url]
請問這些圖片不能覆制的方法是怎樣做 [/quote]
?_? 什麼圖片不能複製?
[quote]原帖由 [i]formyrain[/i] 於 2008-9-15 09:18 PM 發表 [url=http://linux0911.no-ip.info/Discuz/redirect.php?goto=findpost&pid=25664&ptid=9122][img]http://linux0911.no-ip.info/Discuz/images/common/back.gif[/img][/url]
我每次都會卡在把會員匯過去後, 他們無論輸入什麼密碼都會說找不到此用戶
就算我在後台更改他們的密碼也沒有用 = = [/quote]
沒有轉成功, 部分資料表還是 big5 或甚至 latin1 charset
teng 2008-9-20 01:30 PM
回覆 6# Linux0911 的帖子
?_? 什麼圖片不能複製? <-- 這個他是說 頭像那兒吧@.@""呵呵
Linux0911 2008-9-21 02:53 AM
回覆 7# teng 的帖子
如果指的是頭像的話, 就請愛用 google 找尋相關語法吧
formyrain 2008-10-22 02:14 PM
[quote]原帖由 [i]Linux0911[/i] 於 2008-9-20 02:16 AM 發表 [url=http://linux0911.no-ip.info/Discuz/redirect.php?goto=findpost&pid=25694&ptid=9122][img]http://linux0911.no-ip.info/Discuz/images/common/back.gif[/img][/url]
沒有轉成功, 部分資料表還是 big5 或甚至 latin1 charset [/quote]
這是指member的資料表沒有轉成功嗎 |yy56|
formyrain 2008-10-22 03:54 PM
不過我將資料庫存下來看 發現所有的資料表都是CHARSET=utf8
這樣為什麼還會無法登入 ~"~
203790297 2009-6-7 09:38 PM
論壇備份數據庫時不是已經有了輸出編碼格式了嗎??
我就是用那個方法很快速地完成了,big5轉utf-8