各式精緻窗簾,專業窗藝設計師為您服務,量身訂作,專業施工丈量,價格優惠滅鼠專業室內外油漆粉刷工程,裝潢油漆噴漆工程
平實的價位,客戶的滿意

首頁  •  tw 論壇 • 程式設計討論     • 

mysql 4.1中文亂碼問題

房東:阿保
發表時間:2007-03-06
[檢舉]


大部份人升級wordpress 1.5時碰到的問題都是中文亂碼,尤其是如果原本用 mysql 4.0 而同時要升級到 mysql 4.1的話。

主要原因是mysql 4.1在語系方面增加了許\多功\能,它可以設定語系的層次從最底層的 server, database 到單一 table, column, connection 都可以設定,而除了語系之外,還可以指定搭配不同的 collation,所以組合百百種,只要一個錯了就難逃亂碼的命運。(而之前用mysql 4.0為何不用設定也不會出問題呢?主要原因是那時預設是 latin-1,正好相容大部份的utf-8字元,所以不常碰到亂碼)

所以如果你的情況跟我一樣,同時要將 wordpress 從 v1.2升級到 v1.5, 然後mysql也要 v4.0 升級到 v4.1 的話,請看下面流程:

0. 先進phpmyadmin找到可輸入 sql query的畫面,然後鍵入:

show variables like ‘%character%’;

這句話會顯示目前資料庫使用的語系設定,一般國外的網站或剛裝好的 mysql 4.1預設都是 latin-1。

1 新增wordpress blog要用的database名稱,例如 myblog.

如果你熟悉 phpmyadmin 的操作,在畫面上就可以選擇這個新database 要用的語系,

charset 請選擇 UTF-8 Unicode (utf8)
collation 請選擇 utf8_general_ci (ci 代表 case insensitve 大小寫沒差)

2、改 database語系,同樣在 phpmyadmin 的query畫面鍵入下面兩行:

如果你在上一步中沒正確選擇語系,或是在看到本文前已經先建好database了也沒關係,用下面語法可以改回來

alter database myblog
character set utf8;

3、匯入舊的 sql

到這�堿陘螸ysql�堶惜w經有一個 utf-8的 database, 可以準備倒資料進去了,把舊版的sql 文字檔直接copy-paste或上傳到 phpmyadmin即可。注意要告訴phpmyadmin這個文字檔是 utf-8 編碼的才能正確匯入。

根據我的經驗,總是會有一兩個小地方出問題,可能要手動修改一下內容,例如將某些中文字先換成英文,等倒進mysql後再進wordpress 改回來。

4、改 wp-db.php 的設定

前面曾經提過,mysql的語系設定是多層次的,前面我們把database與table的語系都設定正確,但程式與mysql連線時的語系則是由 connection 來決定,這部份就要改wordpress的程式碼,在 \\wp-includes\\wp-db.php 的第 44行加上:

$this->query(”SET NAMES ‘utf8′”);

這句話會同時設定 client, results, connection三者使用的語系為 utf-8。

*最後檢查是否全部改成 utf-8

show variables like ‘%character%’;

此時你應該會看到大部份欄位都是utf-8了,除了 server 這項之外,因為我是用別人的hosting主機,所以沒法兒改這部份,但平常做案子時大部份都可以直接控管mysql,此時就可以用 my.ini 設定:

[mysqld]
default-character-set=utf8

告訴mysql server啟動時要用 utf-8即可。

附帶一提,經過這樣調校的mysql,連接 flash - amfphp - php - mysql 也完全沒問題,可以互傳中文/日文。



  • 贊助網站       

    廣利不動產-板橋在地生根最實在--新板特區指名度最高、值得您信賴的好房仲
    完整房訊,房屋、店面熱門精選物件,廣利不動產 優質仲介,房屋租賃、買賣資訊透明,交易真安心!
    廣利不動產-新板特區指名度最高、值得您信賴的好房仲
    您的托付,廣利用心為您服務

  • 1 樓住戶:達人
    發表時間:2007-06-08
    [檢舉]

    mysql 會出現中文亂碼的原因不外乎下列幾點:

    → mysql server本身設定問題,例如還停留在 latin1

    → mysql table 的語系設定問題(包含 character 與 collation)

    → 客戶端程式(例如 php) 的連線語系設定問題





    mysql 4.1 及之後的版本在語系方面增加了許多功能,它可以設定語系的層次從最底層的 server, database 到單一 table, column, connection 都可以設定,而除了語系之外,還可以指定搭配不同的 collation(校對),所以組合百百種,只要一個錯了就難逃亂碼的命運。



    進phpmyadmin找到可輸入 sql query的畫面,然後鍵入:

    show variables like '%character%';

    這句話會顯示目前資料庫使用的語系設定,一般國外的網站或剛裝好的 mysql 4.1預設都是 latin-1。



    [新增資料庫]

    如果你熟悉 phpmyadmin 的操作,在畫面上就可以選擇建立新 database 要用的語系,

    charset 請選擇 UTF-8 Unicode (utf8)

    collation 請選擇 utf8_general_ci (ci 代表 case insensitve 大小寫沒差)



    [修改資料庫]

    改 database語系,同樣在 phpmyadmin 的query畫面鍵入下面兩行:

    alter database myblog

    character set utf8;





    前面曾經提過,mysql的語系設定是多層次的,前面我們把database與table的語系都設定正確,但程式與mysql連線時的語系則是由 connection 來決定,這部份就要使用程式碼

    mysql_query("SET NAMES 'utf8'");

    這句話會同時設定 client, results, connection三者使用的語系為 utf-8。



    最後檢查是否全部改成 utf-8

    show variables like '%character%';



    此時你應該會看到大部份欄位都是utf-8了,除了 server 這項之外,如果是用別人的 hosting 主機,就沒法兒改這部份,但平常做案子時大部份都可以直接控管mysql,此時就可以用 my.ini 設定:



    [mysqld]

    default-character-set=utf8

    告訴mysql server啟動時要用 utf-8即可。







    *mysql中文亂碼必勝解決法

    1、mysql 啟動時會讀取一個預設的 config 檔,一般名稱為 my.ini,而它會到下列兩位置去尋找這個檔案:

    C:\windows\my.ini 也就是作業系統的安裝目錄,也有可能是 C:\winnt\my.ini

    C:\:my.cnf 也就是 C disk 的根目錄





    2、my.ini �堛漱漁e為:

    [mysqld]

    default-character-set=utf8



    [client]

    default-character-set=utf8

    init_connect='SET NAMES utf8'



    其中 mysqld 是指定 server 啟動時要用的語系,但如果這�堻]定為 utf8 可能會讓許多英文軟體不開心,例如 osCommerce/mediaWiki/wordpress/drupal/gregarius,所以這�堳媊陶]成 latin1。要使用utf8中文的人,只要記得建資料庫時將它設成utf8,讓中文程式正確的使用 utf8 與它溝通即可。





    下面的 client 則是設定當 client 連線時要使用什麼語系,但可惜的是這個設定不是每個 client 都會鳥它,基本上只有 mysql 自已家的程式,例如 mysql.exe, mysqld.exe, mysqladmin.exe 或是 MySQL Control Center 這種程式會去讀取這個設定檔然後改用 utf8 連線。



    所以通常會用一個獨立的檔案來處理 mysql connection的設定,例如:



    PHP:





    //database connection details.

    $host = "localhost";

    $link = mysql_connect($host, "xxx", "xxx");

    mysql_query("SET NAMES 'utf8'");

    mysql_select_db("your_table_name_here", $link);

    ?>




    請注意在 mysql_connect後第五行的地方有加上一個 "set names 'utf8' "的指令,告訴mysql 這個 connection 之後的連線內容都要使用utf8,經過這樣設定後,通常就可以解決大部份問題。



    從這�堣]可以推想得知,如果你有用某種 custom connection pooling 機制,就要記得在每次建立新的 connection 後立即設定為 utf8。



    2 樓住戶:新手
    發表時間:2007-06-08
    [檢舉]

    < ?
    //database connection details.
    $host = "localhost";
    $link = mysql_connect($host, "xxx", "xxx");
    mysql_query("SET NAMES 'Big5'");
    mysql_select_db("your_table_name_here", $link);
    ?>

    用這個方法也可以..
    mysql_connect 後有加上一個 "set names ‘Big5′ " 指令
    告訴 mysql 這個 connection 之後的連線內容都要使用Big5
    經過這樣設定後.. 通常就可以解決大部份問題



     共 2 人回應  選擇頁數 【第1 頁】 

    姓名:
    佈告內容: