Board logo

主題: [已解決]MySQL 4.1.x、phpMyAdmin 2.6.x與BIG5論壇中文亂碼 [打印本頁]

發表人: musicsun    時間: 2005-7-28 01:33 PM     主題: [已解決]MySQL 4.1.x、phpMyAdmin 2.6.x與BIG5論壇中文亂碼

MySQL 版本 4.1.12-nt,server default character set=utf8
請問為何中文部分會變亂碼?
database character set不是已經設成big5...
======================================================================
mysql> CREATE DATABASE `test_db` DEFAULT CHARACTER SET big5 COLLATE big5_chinese_ci;
Query OK, 1 row affected (0.00 sec)

mysql> USE test_db;
Database changed

mysql> CREATE TABLE `test_posts` (
    ->   `pid` int(10) unsigned NOT NULL,
    ->   `subject` varchar(80) NOT NULL default '',
    ->   PRIMARY KEY  (`pid`)
    -> ) DEFAULT CHARSET=big5;
Query OK, 0 rows affected (0.01 sec)

mysql> INSERT INTO `test_posts` VALUES (1, '123發文標題456');
Query OK, 1 row affected, 1 warning (0.00 sec)


mysql> SELECT * FROM `test_posts` LIMIT 0 , 30;
+-----+----------------+
| pid | subject        |
+-----+----------------+
|   1 | 123?o?????D456 |
+-----+----------------+
1 row in set (0.00 sec)

[musicsun 在 2005-8-2 09:59 PM 作了最後編輯]
發表人: Vic    時間: 2005-7-28 03:30 PM

db內有中文內容, charset 好像也不必改.

直接用 CREATE DATABASE `test_db`; 來建立db就可以.

不過我玩的是4.0.25, 不是4.1版 ^^"
發表人: musicsun    時間: 2005-7-28 06:19 PM

又再找了許多文章
應該是4.1版才會遇到的問題

目前看到的解決方法
SET NAMES big5;
發表人: musicsun    時間: 2005-7-28 10:28 PM

找到這兩篇...
http://dev.mysql.com/doc/mysql/en/charset-connection.html
http://dev.mysql.com/doc/mysql/en/charset-metadata.html

若MySQL版本是用4.1.x版
論壇編碼若是用big5,就會看到一堆問號(在database character set=big5下)
不然就要在連線資料庫後
mysql_query("set names 'big5'");
不過這樣又會出現許功蓋的問題

只是不曉得為什麼
原來沒有許功蓋問題的論壇程式
這樣就會有


若MySQL版本是用4.1.x版
就通通用utf-8
比較省麻煩
發表人: musicsun    時間: 2005-7-30 10:15 AM

許功蓋問題應該是這樣...

若subject=許功蓋
$subject1 = $HTTP_POST_VARS['subject'];

$subject1 = 許功蓋

論壇PHP程式
$sql = "INSERT INTO " . TOPICS_TABLE . " (topic_title, topic_poster) VALUES ('$post_subject', " . $userdata['user_id'] . ")"
//PS:INSERT INTO phpbb_topics (topic_title, topic_poster) VALUES ('許功蓋', 2)
query_result = mysql_query($sql);

在MySQL 4.0沒有問題
但在MySQL 4.1就會錯誤
PHP是 4.3.11

MySQL 4.1.2的default setting
character_set_client:utf8
character_set_connection:utf8
character_set_database:utf8
character_set_results:utf8
character_set_server:utf8
character_set_system:utf8

但create database時,default character set是big5,collate是big5_chinese_ci
另外在mysql_connect後,有
mysql_query("set names 'big5'", $this->db_connect_id);

把MySQL 4.1.2升級到4.1.3也是一樣...

有人知道為什麼嗎?

[musicsun 在 2005-7-30 02:08 PM 作了最後編輯]
發表人: musicsun    時間: 2005-7-30 10:20 PM

大概知道原因了...

所以若用MySQL 4.1
若網頁語系不用utf8,如big5
則把database character set設latin1 (剛測試這裡設utf8也可,但還是要set names latin1)
在mysql_connect後
mysql_query("set names latin1", $this->db_connect_id);

再來就是若有用phpMyAdmin的
就要把phpMyAdmin改成可以用big5顯示
不過若是主機商提供的phpMyAdmin就可能沒辦法改了

[musicsun 在 2005-7-30 11:28 PM 作了最後編輯]
發表人: musicsun    時間: 2005-8-2 09:06 PM

解除phpMyAdmin強制使用utf8...
因為不可能有時間去研究phpMyAdmin程式也不懂PHP,所以花了三四個小時吧(???)用夾擊法找出來...
在 /libraries/database_interface.lib.php 中,註解掉兩個if區塊

引用:

    if (PMA_MYSQL_INT_VERSION >= 40100) {
/*
        // If $lang is defined and we are on MySQL >= 4.1.x,
        // we auto-switch the lang to its UTF-8 version (if it exists)
        if (!empty($GLOBALS['lang']) && (substr($GLOBALS['lang'], -5) != 'utf-8')) {
            $lang_utf_8_version = substr($GLOBALS['lang'], 0, strpos($GLOBALS['lang'], '-')) . '-utf-8';
            if (!empty($GLOBALS['available_languages'][$lang_utf_8_version])) {
                $GLOBALS['lang'] = $lang_utf_8_version;
                $GLOBALS['charset'] = $charset = 'utf-8';
            }
        }

        // and we remove the non-UTF-8 choices to avoid confusion
        if (!defined('PMA_REMOVED_NON_UTF_8')) {
            $tmp_available_languages        = $GLOBALS['available_languages'];
            $GLOBALS['available_languages'] = array();
            foreach ($tmp_available_languages AS $tmp_lang => $tmp_lang_data) {
                if (substr($tmp_lang, -5) == 'utf-8') {
                    $GLOBALS['available_languages'][$tmp_lang] = $tmp_lang_data;
                }
            } // end foreach
            unset($tmp_lang, $tmp_lang_data, $tmp_available_languages);
            define('PMA_REMOVED_NON_UTF_8',1);
        }
*/
        $mysql_charset = $GLOBALS['mysql_charset_map'][$GLOBALS['charset']];
        if ($is_controluser || empty($collation_connection) || (strpos($collation_connection, '_') ? substr($collation_connection, 0, strpos($collation_connection, '_')) : $collation_connection) == $mysql_charset) {
            PMA_DBI_query('SET NAMES ' . $mysql_charset . ';', $link, PMA_DBI_QUERY_STORE);
        } else {
            PMA_DBI_query('SET CHARACTER SET ' . $mysql_charset . ';', $link, PMA_DBI_QUERY_STORE);
        }
        if (!empty($collation_connection)) {
            PMA_DBI_query('SET collation_connection = \'' . $collation_connection . '\';', $link, PMA_DBI_QUERY_STORE);
        }
        if (!$is_controluser) {
            $collation_connection = PMA_DBI_get_variable('collation_connection',     PMA_DBI_GETVAR_SESSION, $link);
            $charset_connection   = PMA_DBI_get_variable('character_set_connection', PMA_DBI_GETVAR_SESSION, $link);
        }

        // Add some field types to the list
        // (we pass twice here; feel free to code something better
        if (!defined('PMA_ADDED_FIELD_TYPES')) {
            $GLOBALS['cfg']['ColumnTypes'][] = 'BINARY';
            $GLOBALS['cfg']['ColumnTypes'][] = 'VARBINARY';
            define('PMA_ADDED_FIELD_TYPES',1);
        }

    } else {
        require_once('./libraries/charset_conversion.lib.php');
    }


phpMyAdmin執行環境設定...
Language是設定character_set_client、character_set_results這兩個的character set
MySQL connection collation(MySQL 連線校對)是設定character_set_connection的character set
網頁編碼解除自動選取,自己選取的編碼,就對應論壇網頁設定的編碼
但...
character_set_database這個就不清楚當選取database時,phpMyAdmin會不會自己根據database的character set去設...
不過因為之前的測試,latin1和utf8都沒影響,這個有沒有去設定應該沒什麼關係...

使用實例
根據BIG5論壇使用latin1(或utf8)資料庫,加上mysql_connect後,mysql_query("set names latin1", $this->db_connect_id)...
phpMyAdmin設定...
Language設定english-iso-8859-1,MySQL connection collation設定latin1_general_ci,網頁編碼設繁體中文
這樣就可以用phpMyAdmin看到中文資料了...

[musicsun 在 2005-8-2 09:11 PM 作了最後編輯]




歡迎光臨 TWed2k (http://twed2k.org/) Powered by Discuz! 4.1.0