MySQL 4.0.24 > 5.0.33 資料轉換

edited 十月 2013 in 資料庫
有一個過去的資料庫是建立在 MySQL 4.0.24 ,當時並不需要設定文字的編碼,所以都是使用預設的 latin1 建立,而儲存的文字資料是 utf-8 編碼;剛剛直接將它移到 MySQL 5.0.33 時發現透過舊有 PHP 程式存取並沒有問題,方式是直接將 mysql/data 中關於與資料庫同名的資料夾直接複製到新版中。接著希望將它調整成符合新版規範的格式,也就是將文字的校對調整為 utf8 ,預設的匯出指令中,輸出的中文字都會變成亂碼:
mysqldump -uroot -p my_db > test.sql
下面是 status 指令的輸出:
Server version:         5.0.33 Source distribution
Protocol version:       10
Connection:             localhost via TCP/IP
Server characterset:    latin1
Db     characterset:    latin1
Client characterset:    latin1
Conn.  characterset:    latin1
找了一下網路,發現下面這篇文章:
http://confluence.atlassian.com/display/DOC/Configuring+Database+Character+Encoding

用其中的指令可以順利產生正確的中文輸出:
mysqldump -uroot -p --default_character-set=latin1 --skip-set-charset my_db > test.sql

接著透過文字編輯器將檔案中所有的
DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci
改為
DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

collate latin1_general_ci
改為
collate utf8_unicode_ci

最開始的地方加上下面這行:
set names utf8;

然後將檔案塞回資料庫就 OK 了

原始討論: http://twpug.net/x/modules/newbb/viewtopic.php?topic_id=2538

評論

  • edited 四月 2007
    4.0升4.1也可適用這個方式升級
    前陣子使用drupal升級資料庫也有遇到類似的問題
  • edited 九月 2010
    mysqldump -u root -p --default_character-set=latin1 --skip-set-charset my_db > test.sql

    我這樣輸入會有錯誤耶?(my_db已有改)
  • edited 九月 2010
    錯誤訊息是?
    不然不曉得狀況也幫不上忙
  • edited 五月 2011
    最近處理了另外一個需求,資料庫是使用 MySQL 4.0.20 ,內容主要儲存為 big5 編碼,希望移轉到 MySQL 5.1.49 上

    由於主機不允許進入指令模式,而 PHP 為 4.4.4 ,所以我是先將 phpMyAdmin 2.11.11.3 塞進客戶的網頁目錄中,透過它將現有的資料庫匯出

    直接要在主機匯入時會出現很多錯誤,因為匯出的資料有很多跳脫字元,這時候注意到 phpMyAdmin 自動在匯出的檔案加入了 SET NAMES utf8 的設定。試著將 utf8 換為 latin1 或 big5 時資料會變成亂碼,但是直接用 big5 編碼打開匯出的 SQL 檔案也是看到亂碼(可能是因為我在 Linux 環境預設使用 utf8 編碼。

    最後試出一個方式,先透過 php 的 mb_convert_encoding() 將匯出檔案轉換為 utf8 編碼,這時候就可以看到正確的中文字。只是嘗試要匯入時就會卡在很多地方,因為在 big5 編碼使用的跳脫字元,在 utf8 變成多餘的,而且會造成錯誤。

    於是就透過取代的方式,將會影響的跳脫字元全部移除,在 SET NAMES 位置改為 utf8 就可以順利匯入。

    在這個測試過程也發現,其實 MySQL 5.1 會自動進行文字編碼的轉換,像是上面這個以 utf8 編碼的 SQL 匯出檔,我將它匯入到使用 big5_chinese_ci 編碼的資料表,系統會自動將 utf8 轉換為 big5 ,因此不需要將原有程式轉換為使用 utf8 編碼,只要在資料庫連線時加上 SET NAMES big5 就可以繼續以 big5 編碼正常使用。
Sign In or Register to comment.