2010年8月23日 星期一

joomla 1.0升級成1.5版,mysql資料庫latin1轉utf8問題

相信 MySQL 的編碼對很多人來說 … 一直是個相當令人頭痛的問題 … 底下要記錄的是如何把資料庫的資料, 由 latin1 轉成 utf8..
一般 .. MySQL 裝起來後(用 rpm 安裝) ,系統的預設編碼是 latin1.
而很多人在安裝一些網頁的系統時,如 wordpress、LifeType、phpBB … 等等,都會選擇 utf8 。
這時 … 系統一樣可以正常運作 … 只是當用 phpmyadmin 進入管理資料庫時,就會發現 .. 怎麼中文字的部分都變成了歪七扭八 ..
或者一些鬼畫符的文字。如:凡事先從工作講起
image

此現象就是 utf8 的文字以 latin1形式儲存,phpmyadmin 以 utf8 的資料讀取方式讀取 … 讀出來的資料就是這種鬼畫符…><。這種現象平日運作也都還OK反正在資料庫裏多數時間都不會需要改到資料本身,對於在phpmyadmin裏看到亂碼並不會有大問題,然而一旦到系統升級時,例如Mysql升級到5以上版本後系統內定的編是utf8,而像joomla1.5等內容管理系統內定的編碼也是utf8,像筆者就是在joomla1.0.15升級為1.5時面臨升級的資料在1.5版裏全部是亂碼,為此我上網找了非常多的資料,多數所看到的是big5碼轉utf8的方式適用的,而對於以latin1作為預設編碼而實際內容為utf8者,這種方式我試過了,都還是失敗了,不論是phpmyadmin輸出的*.sql檔,再透過emeditor轉碼,或直接在mysql以指令的方式改都一樣不行,其中我最後發現在phpmyadmin裏輸出轉檔失敗的地方主要是預設的編碼為lanti1而實則為utf8的資料庫,在phpmyadmin裏看到的即是亂碼,以在以phpmyadmin輸出資料庫時,即為亂碼,且其轉出的資料庫又因為其內容實為utf8的編,所以輸出以emeditor轉碼時,根本不會因為選擇utf8碼取代而使看到的中文字變正常。所以面對這種類型的編碼升級所遇到的問題,我目前所試到的唯一的成功方式是底下所要記錄的:
1. 進入 phpmyadmin 內一個名為 libraries 的子目錄 .. 編輯 select_lang.lib.php. 找到 $mysql_charset_map 這一段下方 ..
‘utf-8′ => ‘utf8′,
image
把它改成
‘utf-8′ => ‘latin1′,
然後存檔 … 這時候就可以發現原先的鬼畫符 … 這時候又都正常了.

image

修改後, PHPMYADMIN就能看到正常的中文
然後export, ,這時輸出的格式才對phpmyadmin來說才是真的是latin1,然後以emeditor去將其打開,會出 現下圖image就像我選的這做,進去可看到imageimage ,選擇你看到不會是亂碼的編碼方式開啟,打開後,還要做一些內容的更改,以告訴phpmyadmin此資料庫的預計編碼為utf8,
#首先在輸出的資料庫檔.sql檔案的前面的部份找到這一加入以下三行文字

-- phpMyAdmin SQL Dump
-- version 2.11.9.4
-- http://www.phpmyadmin.net
--
-- 主機: localhost
-- 建立日期: Aug 27, 2010, 10:54 PM
-- 伺服器版本: 5.0.77
-- PHP 版本: 5.1.6

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES latin1 */;

改成

/*!40101 SET NAMES utf8 */;

#再來把每個資料表後面的把CHARSET=latin1改成CHARSET=utf8

我的做為是在emeditor裏選擇取代的功能,一次就把每個資料表後面的CHARSET=latin1改成CHARSET=utf8全部改完。

最後將其另存新檔,做如下圖的選項使其編碼方式真的改為utf8,image,然後到phpmyadmin裏將原資料庫刪除,而新建一個同樣名稱的資料庫,但是預設校對編碼要選utf8_general.ci,image

再將改好的*.sql載入即完成轉編的方式。

image

其中若你的原資料庫為big5的文字以 latin1形式儲存者,則一樣比照此一方式應可,唯一不同的地方是,在

$mysql_charset_map 這一段下方 ..

'big5'  => 'big5'

把它改成
'big5' => ‘latin1′,

其餘的都一樣操作即可。

沒有留言: