mysql 4.1中文亂碼第二擊

In php/mysql   August 14, 2005 - 11:34 am

自從貼了wordpress 升級與mysql中文亂碼這篇後,大概每天都有有幾十個依此關鍵字而來的網友,同時也接到一些email詢問大同小異的亂碼問題,仔細想想後覺得還是把這個問題再解釋清楚一點。

首先,要讓mysql 4.1正確顯示中文最簡單的方法就是全程使用 utf8,從網頁到連線到資料庫等,而my.ini的設定如下:

[mysqld]
default-character-set=utf8

#settings for clients (connection, results, clients)
[mysql]
default-character-set=utf8

其中 [mysqld] 是設定 mysql啟動時要採用的語系,而[mysql]則是通知外來的連線client(例如php頁面或 flash 程式)要使用何種語系設定。

這個設定方法對一般的開發工作非常適用,但有個小缺點,就是當使用一些open source php程式時(尤其是英文寫的程式),如果這些程式語法還停留在mysql 4.0時代,那上面的設定就會導致中文顯示變的怪怪的,最明顯的情況就是大部份中文都顯示的出來,但少部份會變成 方塊型+問號 的亂碼,例如「裏」這個字幾乎是穩死。

這種情況我個人在 drupal 與 gregarius(一個php rss reader) 上見過,經過一番debug才發現了上述原因,後來終於找到解決方法。

最簡單的方式就是不要下面這段:

[mysqld]
default-character-set=utf8

拿掉這段後會讓mysql 啟動時停留在預設的latin-1語系,這樣會讓大部份英文程式都很快樂,而要使用utf8中文的人,只要記得建資料庫時將它設成utf8,然後保留 [mysql] 這段設定,讓中文程式正確的使用utf8與它溝通即可。

經過測試,這樣改良後的設定,使用常見的英文php軟體(如wordpress, drupal, OSCommerce, gregarius)都沒問題,而我每天開發要用的 flash – amfphp – php – mysql 黃金組合也同樣ok。

by admin

16 Comments Add your own

  • 1. 路過的柚子&hellip  |  September 10th, 2005 at 10:04 pm

    感謝您的寶貴訊息
    經過這樣的設定 的確打死目前流行的許多程式
    只是
    不知道有沒有試驗過mediawiki?…
    無論我怎麼試(全都設定成utf8)
    依然會卡在最後的安裝上…
    直到將mysql改成4.0版才安裝成功
    可是 要將其他原本在 mysql4.1.8所建立的資料庫
    裝回去 就有點麻煩了 …

    實驗環境 appserv 2.4.3(mysql4.1.8)
    &&appserv 2.4.4a(mysql 4.0.24)

  • 2. jeremy&hellip  |  September 10th, 2005 at 11:38 pm

    hi 柚子

    我沒試過mediawiki,但已抓了一份回來,我會儘可能模擬出相同的環境來測試,等試驗完後再回報 :)

  • 3. jeremy&hellip  |  September 11th, 2005 at 12:30 am

    剛剛試驗了一下,php 5.0.4 + mysql 4.1.12 + mediawiki 1.4.9。

    結果第一次就順利裝好,並且可以使用中文(還來回用 IE 6, firefox跟safari試過)。

    進mysql看到的設定,全部都是 latin1。

    在mediawiki的 Release-Note文件裏有提到下面這段:

    If MySQL is set with utf-8 as the default character set, installation
    may fail with “key too long” errors. Set the default charset to ‘latin1′
    for installation and it should work

    你可能是被這個地方卡到了,可以試試先把 my.ini 裏面的設定改回 latin1讓meidawiki快樂的安裝,之後你要怎麼設定database, connection, client, results的語系都沒關系。(不過目前看來用latin1似乎也能兼容中文,如果沒爆炸,就別修了吧…當然試的中文字可能不夠多,所以沒出現亂碼,只是我都用doku wiki, so…)

  • 4. 路過的柚子&hellip  |  September 11th, 2005 at 2:43 am

    感謝您的實驗
    可是我還是裝不起來 @@a

    step1 將appserv目錄全部反安裝後刪除 重新開機
    再安裝appserv2.4.3但是將phpmyadm改成2.6.3pl
    其他使用內定設定與程式
    >
    setp2 創立一新帳號 wikiadm
    但是 mysql 4.1.8 若是直接設定密碼 就無法使用 所以先 不使用密碼 之後以手動方式 加入密碼 (相容mysql 4.0)才能使用
    setp3 解開wiki放到apache下 安裝
    >
    setp4 出現錯誤訊息如下
    # PHP 4.3.10: ok
    # Warning: PHP’s register_globals option is enabled. MediaWiki will work correctly, but this setting increases your exposure to potential security vulnerabilities in PHP-based software running on your server. You should disable it if you are able.
    # PHP server API is apache; ok, using pretty URLs (index.php/Page_Title)
    # Have XML / Latin1-UTF-8 conversion support.
    # PHP is configured with no memory_limit.
    # Have zlib support; enabling output compression.
    # Turck MMCache not installed, can’t use object caching functions
    # Found GD graphics library built-in, image thumbnailing will be enabled if you enable uploads.
    # Installation directory: c:\appserv\www\wiki
    # Script URI path: /wiki
    # Warning: $wgSecretKey key is insecure, generated with mt_rand(). Consider changing it manually.
    # Connected as root (automatic)
    # Connected to database… 4.1.8-nt; enabling MySQL 4 enhancements
    # Warning: $wgSecretKey key is insecure, generated with mt_rand(). Consider changing it manually.
    # Database wikidb exists
    # Creating tables… done.
    # Initializing data…
    # Granting user permissions…
    Sorry! The wiki is experiencing some technical difficulties, and cannot contact the database server.

    然後就停住了,…..
    可是相同的設定在mysql4.0就好的很 = =

  • 5. jeremy&hellip  |  September 11th, 2005 at 12:03 pm

    呃 看來我的測試環境還是相差太遠,要複製一個完全一樣的才準。

    我剛下載了 appserv 2.4.3,準備在vmware/winxp裏模擬一個環境出來,試完再跟你說。

    不過就你的錯誤訊息來看:
    # Granting user permissions…
    Sorry! The wiki is experiencing some technical difficulties, and cannot contact the database server.

    最後應該是死在mysql連線這段。

  • 6. jeremy&hellip  |  September 17th, 2005 at 4:48 pm

    昨天裝了完全一樣的環境測了一下,果然會出現上面的錯誤,但目前沒有時間可以debug找出原因。

    但至少我們已經知道,php5+mysql 4.1的組合是ok的,而php4+mysql 4則不行。

  • 7. 路過的柚子&hellip  |  September 19th, 2005 at 7:50 am

    嗯嗯 感謝您花費寶貴時間幫我測試
    目前我還是先退回舊的版本
    等完全穩定之後才改版好了

    感謝~~~~ :)

  • 8. 月夜火 :: MySQL 5 使&hellip  |  May 24th, 2006 at 7:29 pm

    [...] 完成:把 MySQL 裡的資料庫換成 UTF-8。參考:如何修正 MySQL 資料庫的 encoding [Jeffhuang.idv.tw]、MySQL 4.1.x SET NAMES UTF8 [blog.dragon2.net]、wordpress 1.5 升級注意事項──中文亂碼篇 [ria.richtechmedia.com]、mysql 4.1 中文亂碼第二擊 [ria.richtechmedia.com] [...]

  • 9. 很麻烦&hellip  |  November 27th, 2006 at 7:20 pm

    真的是麻烦 我现在还是没办法加入中文阿

    请哪位大哥帮我解决一下阿

    我现在用的Mysql 4.1 但是还是没办法解决中文

    问题

  • 10. origin2&hellip  |  December 13th, 2006 at 6:24 am

    如果 server 的所有 variable 都設定成 utf8 ,
    但是使用上還是會出現亂碼的狀況的話,
    大概是在 connect 的時候沒有指定要用 utf8 連線,
    所以系統又「自動」跑去用了 latin1 …

    參考一下這一篇
    http://ria.richtechmedia.com/2005/12/19/【保証成功】的 mysql 中文亂碼解決方案/
    再參考一下 mysql 4.1 的 reference manual 裡面對 init_connect 的說明
    http://dev.mysql.com/doc/refman/4.1/en/server-system-variables.html

    會發現第一篇中文亂碼解決方案在 my.ini/my.cnf 裡面給的設定有問題,
    init_connect 要下在 [mysqld] 這一段裡面才對…
    把 init_connect 那一行改到 [mysqld] 這一段裡面去,
    然後不要用具有 SUPER 權限的使用者連線就不會有問題了。

  • 11. 星宿喵的萌落格 &ra&hellip  |  January 17th, 2007 at 11:39 pm

    [...] 原因:我看了很久原始碼,這情形我認為是主機上次升級後也更新了 MySQL 的主要版本到5(對吧?)5之後各小改版又對於語系編碼的處理方式好像不是很一致跟統一。所以在MySQL內定的latin-1語系和WP我所設定的utf8轉來轉去…某個環節就轉成亂碼了技術文件參考 http://ria.richtechmedia.com/?p=213 [...]

  • 12.  |  May 10th, 2007 at 5:34 pm

    蘋眅狨荌 3.7

    堍俴蘋眅狨荌ㄛ綴輛蚔牁﹝婓蚔牁笢偌 HOME 瑩ㄛ慾魂狨荌﹝
    彆祥夔慾魂ㄛ硐剒偌ALT+TAB昢遙善狨荌憩褫眕賸﹝

    5
    髡夔賡庄:

    **********蛁砩:垀衄髡夔扢离綴ㄛ剒偌扢离符頗汜虴********

    1.赻雄硃悛 剒蔚硃悛狻溫5弇离
    2.赻雄硃囀 剒蔚硃囀狻溫6弇离
    3.赻雄苂馨 扢离悛講屾衾扢离硉赻雄苂馨﹝苂馨髡溫8弇离﹝
    4.赻雄褶髡 恁寁赻雄褶髡ㄛ扢离党褶腔挕髡溫珨棒垀秏瘧腔囀薯﹝
    彆肮奀褶謗跺挕髡ㄛ扢离秏瘧郔屾囀薯挕髡腔杅硉﹝
    湖釴溫1弇离ㄛ剒党褶腔挕髡溫8 睿 9 弇离﹝

    5.敦諳趙蚔牁 婓蚔牁笢偌f11
    6.赻雄滌趕 恁寁赻雄佽趕ㄛ扢离潔路奀潔ㄛ睿佽趕腔囀﹝
    7.赻隅砱扷梓衵瑩髡夔
    8.赻雄湖墅 巠磁党褻翋雄撮夔﹝
    蛁砩ㄛ恁寁赻雄湖墅綴ㄛ猁恁寁疑湖墅腔桸宒﹝婓赻雄湖釴腔奀緊岆艘祥善赻撩腔褒伎釴狟腔﹝
    筍岈妗奻眒冪釴狟賸ㄛ梗珩頗艘善斕釴狟﹝涴跺奀緊祥猁雄扷梓ㄛ祥猁軗雄﹝ 彆涴奀緊湖墅ㄛ
    墅昜腔悛岆祥頗裁腔,涴奀硐猁忒雄偌釴狟ㄛ綴婬偌懂, 憩頗閥葩淏都﹝

    馴僻墅昜閉奀癹秶 岆硌馴僻墅昜閉徹癹秶奀潔綴ㄛ溫馴僻﹝
    衄奀緊墅昜婓變祥徹腔華源憩頗堤珋涴欴腔錶ㄛ芢熱30 ~ 45鏃

    9.毓峓境儂 隅砱赻雄湖墅毓峓

    13.隅奀湔 隅奀蔚踢湔輛累踱

    14.赻雄葩魂 侚厗綴 15鏃 赻雄埻華葩魂,甜赻雄勛珨棒HP狻睿MP狻

    **********蛁砩:垀衄髡夔扢离綴ㄛ剒偌扢离符頗汜虴********

  • 13. pei&hellip  |  May 15th, 2007 at 6:18 am

    你好 我的MySQL的架構都是utf8 collation: utf8_general_ci, 但是因為我之前備份出來失敗, 所以變成亂碼 , 可是怎麼會編輯更改後 還時原本”�?�” 這樣的亂碼還是一樣 像是 健康的”健” 怎麼改 顯示都是�?�

    我用的是wordpress 2.1.3 MySQL 4.1 頭痛啊!

  • 14. - F . M . - » 還&hellip  |  May 25th, 2007 at 12:29 am

    [...] http://ria.richtechmedia.com/?p=213 [...]

  • 15. Charles&hellip  |  June 29th, 2007 at 11:20 am

    我有一亂碼的問題,不知道各位高手有沒有遇過。
    PHP, MYSQL
    在PHP code裡,直接下一串有中文的SQL Command進MYSQL,沒有問題。(Update TableName Set FieldName=’中文的’)
    但是同樣的SQL Command,如果是從txt文字檔讀出來,直接寫進MYSQL資料庫的話,phpadmin中顯示亂碼。
    (從文字檔讀出來的SQL Command,直接顯示在網頁上是正常的,但是寫進資料庫後,phpadmin顯示亂碼)

  • 16. hegs&hellip  |  August 5th, 2008 at 3:48 pm

    lampp支持gb2312简体中文:

    1. create database dbname character set gb2312;
    2. create table tbname character set gb2312 {…} …;
    3. /*!40101 SET NAMES gb2312 */;
    insert into tbname ( …)volues(),…;
    4. 查找

    query mysql

    中文MySQL样例
    <?php
    /* 连接选择数据库 */
    $link = mysql_connect(”localhost”, “root”, “”)
    or die(”Could not connect”);
    print “Connected successfully”;
    mysql_query(”SET NAMES ‘gb2312′”);
    mysql_select_db(”dbname”) or die(”Could not select database”);

    /* 执行 SQL 查询 */
    $query = “SELECT * FROM tbname”;
    $result = mysql_query($query) or die(”Query failed”);
    /* 在 HTML 中打印结果 */
    print “\n”;
    while ($line = mysql_fetch_array($result, MYSQL_ASSOC)) {
    print “\t\n”;
    foreach ($line as $col_value) {
    print “\t\t$col_value\n”;
    }
    print “\t\n”;
    }
    print “\n”;

    /* 释放资源 */
    mysql_free_result($result);

    /* 断开连接 */
    mysql_close($link);
    ?>

留言回應

hidden

您的留言會先經過站長認証後才刊登在網站上。
your comments will be approved by Administrator before appearing on the page.

Trackback this post  |  Subscribe to the comments via RSS Feed

mobile phone