[問題] 關於phpMyAdmin裡的欄位亂碼,但在phpbb的顯示為正常...

phpMyAdmin Running Discuss
關於 phpMyAdmin 架設使用操作討論,非本程式相關問題一律砍文!

版主: 版主管理群

HEICZG
星球公民
星球公民
文章: 41
註冊時間: 2004-03-08 20:13

文章 HEICZG »

我是自己架設的@@

不過 我試試看換phpmyadmin的版本看看

說不定真的是版本所造成的..PS.我的版本是2.8.2
●架設主機作業系統:Linux Fedora Core 5
●快速架站程式:無
●您的上網方式:HINET ADSL 2M/512K(1固定,7浮動)
●您的 phpBB2 版本:phpBB 2.0.2.1
●您的 domain(網域名稱) :ffxi.servehttp.com
●您的 phpBB2 連結網址:http://ffxi.servehttp.com/
chiouss
竹貓忠實會員
竹貓忠實會員
文章: 1741
註冊時間: 2002-11-29 18:19

文章 chiouss »

danLu 寫:國外的網站的話,要求他們幫忙做設定有點困難,
我的經驗是換phpmyadmin 版本,
目前我的經驗2.5.7 版Big 與UTF8都可以正常備份與瀏覽,
2.6.4 與2.8.1則不行。
唉~ 這個鳥問題被以訛傳訛多少次了,開個 AllowAnywhereRecoding 就可以解決了 Orz

phpMyAdmin 匯出最大的問題卡在會 connection time out 造成資料不完整,要克服這個辦法只能改用 mysqldump 在主機執行之後再把 sql 丟出來下載。
頭像
kljian
星球公民
星球公民
文章: 71
註冊時間: 2003-12-02 08:10
來自: takumi
聯繫:

文章 kljian »

HEICZG 寫:我是自己架設的@@
不過 我試試看換phpmyadmin的版本看看
說不定真的是版本所造成的..PS.我的版本是2.8.2
你的問題跟版本沒關係啦!請參考以下這兩個做法可能對你有幫助。

http://www.aman.38.com/phpnuke/modules. ... 7&menu=116

http://bbs.wefong.com/viewthread.php?ti ... a=page%3D2
HEICZG
星球公民
星球公民
文章: 41
註冊時間: 2004-03-08 20:13

文章 HEICZG »

感謝各位@@

最近手上得先忙其它的東東

待空閒下來後再仔細重新試過一次...

如成功後再上來報告~
●架設主機作業系統:Linux Fedora Core 5
●快速架站程式:無
●您的上網方式:HINET ADSL 2M/512K(1固定,7浮動)
●您的 phpBB2 版本:phpBB 2.0.2.1
●您的 domain(網域名稱) :ffxi.servehttp.com
●您的 phpBB2 連結網址:http://ffxi.servehttp.com/
philio
星球普通子民
星球普通子民
文章: 4
註冊時間: 2006-08-11 10:42

文章 philio »

我遇到了和你完全一樣的問題,頁面是UTF-8,數據庫的缺省character也是UTF8,但存儲在mysql中的數據就是不對,都是亂碼,神奇的是在phpbb中倒是一切正常。後來的解决也是參考了竹貓的一篇文章,修改了includes/db.php
在最下方添加:
$db->sql_query("SET NAMES utf8;");
$db->sql_query("SET CHARACTER_SET_CLIENT=utf8;");
$db->sql_query("SET CHARACTER_SET_RESULTS=utf8;");

然後就可以了

有個地方一定要注意,這樣修改后,頁面上中文的顯示就變成亂碼了,因爲這時頁面上顯示的就是數據庫中保存的內容。這時需要手工把數據庫中的亂碼改成正確的值。所以這種辦法只適用于新架站點,有很多資料的站點需要一些額外的工作。

我的理解是,雖然頁面編碼是utf8,數據庫也是utf8,但是因爲沒有執行set names utf8,所以php和mysql之間的連接采用的是latin1語系(iso-8859-1),從而導致了這個問題。

舉個例子吧:比如“笨”字,它的utf8編碼是E7ACA8,是一個24位的碼元,但由于connection character set是latin1,所以它被認爲是三個8位的latin1碼元,它們的編碼分別是"E7", "AC"和"A8"。到了mysql,由于mysql的database character set是utf8,所以mysql不會以latin1格式存儲它,而是以utf8格式存儲。由于內碼是"E7"的latin1字符的utf8編碼是C3A7,AC是C2AC,A8是C2A8,這樣”笨“字在mysql里的編碼就變成了C3A7C2ACC2A8,這樣用mysqlMyAdmin里看來當然就成了亂碼,而且無論你怎麽倒出,它都是亂碼。但是用同樣的過程導回去,C3A7C2ACC2A8先變成E7ACA8進行傳輸,然後到了phpbb端,E7ACA8被正確地識別成了”笨“字,這樣phpbb還是可以正確識別這個漢字。

所以如果是有大批資料要轉換的站點,就需要模擬這個過程,先把資料轉換成正確的utf8編碼,然後再想辦法存回去。一個可能的思路是,手工寫一個php程序,先不要加那幾條”SET NAMES utf8”,把數據庫里的資料讀取出來,然後SET NAMES utf8后再存回去,應該就可以做到正確轉換了。我大致寫了一個,在我這裏測試沒問題。

順便提一下,在mysql里看某個字串的編碼,可以用hex函數;而得到編碼xxx對應的字符,則是用unhex函數。
HEICZG
星球公民
星球公民
文章: 41
註冊時間: 2004-03-08 20:13

文章 HEICZG »

philio 寫:有個地方一定要注意,這樣修改后,頁面上中文的顯示就變成亂碼了,因爲這時頁面上顯示的就是數據庫中保存的內容。這時需要手工把數據庫中的亂碼改成正確的值。所以這種辦法只適用于新架站點,有很多資料的站點需要一些額外的工作。
所以如果是有大批資料要轉換的站點,就需要模擬這個過程,先把資料轉換成正確的utf8編碼,然後再想辦法存回去。一個可能的思路是,手工寫一個php程序,先不要加那幾條”SET NAMES utf8”,把數據庫里的資料讀取出來,然後SET NAMES utf8后再存回去,應該就可以做到正確轉換了。我大致寫了一個,在我這裏測試沒問題。

順便提一下,在mysql里看某個字串的編碼,可以用hex函數;而得到編碼xxx對應的字符,則是用unhex函數。
唔...感謝詳細的解說....不過這已經超過小弟我能夠理解的範圍了~"~
只知道看來是非常麻煩....

這一連串看完..
越看越迷糊(因為好像感覺大家的結論都不同..也好像相同..總之就是看不懂XD) 看來我還得再努力 還是要謝謝大家解答~我會再努力去理解這串討論的結論的...
●架設主機作業系統:Linux Fedora Core 5
●快速架站程式:無
●您的上網方式:HINET ADSL 2M/512K(1固定,7浮動)
●您的 phpBB2 版本:phpBB 2.0.2.1
●您的 domain(網域名稱) :ffxi.servehttp.com
●您的 phpBB2 連結網址:http://ffxi.servehttp.com/
philio
星球普通子民
星球普通子民
文章: 4
註冊時間: 2006-08-11 10:42

文章 philio »

你可以這樣測試一下:
先隨便注册一個中文帳號,然後登陸phpMyAdmin, 執行下麵這條sql語句(這裏假定你的表名的前綴是phpbb_,如果不是要改成相應的表名):
select user_id, username, hex(username) from phpbb_users order by user_id desc limit 1;

然後把結果貼出來,同時把那個中文名字也寫出來,這樣可以確定你的問題是不是和我的問題一樣.

保險起見,最好再把下麵語句的結果貼上來:
show variables like "char%";
HEICZG
星球公民
星球公民
文章: 41
註冊時間: 2004-03-08 20:13

文章 HEICZG »

philio 寫:你可以這樣測試一下:
先隨便注册一個中文帳號,然後登陸phpMyAdmin, 執行下麵這條sql語句(這裏假定你的表名的前綴是phpbb_,如果不是要改成相應的表名):
select user_id, username, hex(username) from phpbb_users order by user_id desc limit 1;

然後把結果貼出來,同時把那個中文名字也寫出來,這樣可以確定你的問題是不是和我的問題一樣.
我註冊的id叫"測試用帳號"
查詢後的產生的亂碼中文部分是"¬è©¦ç”¨å¸³è™Ÿ"
而十六進位是"E6B8ACE8A9A6E794A8E5B8B3E8999F"
(以上"是我用來標示的)
philio 寫: 保險起見,最好再把下麵語句的結果貼上來:
show variables like "char%";
如下

Variable_name        Value
character_set_client      utf8
character_set_connection    utf8
character_set_database    utf8
character_set_results      utf8
character_set_server      latin1
character_set_system     utf8
character_sets_dir       /usr/share/mysql/charsets/

但再附上一張 在mysql裡使用
show variables like 'character_set%'; <==這指令所產生的結果
圖檔

之前是有把他全改成顯示為utf8 但後來弄不定又把他還原成latin1
不曉得有沒有影響@@

大致環境如上
麻煩你了<(_._)>
●架設主機作業系統:Linux Fedora Core 5
●快速架站程式:無
●您的上網方式:HINET ADSL 2M/512K(1固定,7浮動)
●您的 phpBB2 版本:phpBB 2.0.2.1
●您的 domain(網域名稱) :ffxi.servehttp.com
●您的 phpBB2 連結網址:http://ffxi.servehttp.com/
chiouss
竹貓忠實會員
竹貓忠實會員
文章: 1741
註冊時間: 2002-11-29 18:19

文章 chiouss »

HEICZG 寫:之前是有把他全改成顯示為utf8 但後來弄不定又把他還原成latin1
不曉得有沒有影響@@
改來改去裡面存的資料會爛掉,不然就不會要求要先 mysqldump 出來轉碼再塞回去了。

要搞清楚 charset 的問題的話建議你把 reference manual ch10 (好像是這章吧?講有關 charset 和 collation 的) 看一遍,有問題再自己做實驗或是發問。
philio
星球普通子民
星球普通子民
文章: 4
註冊時間: 2006-08-11 10:42

文章 philio »

HEICZG 寫: 我註冊的id叫"測試用帳號"
查詢後的產生的亂碼中文部分是"¬è©¦ç”¨å¸³è™Ÿ"
而十六進位是"E6B8ACE8A9A6E794A8E5B8B3E8999F"
"測試用帳號"的utf8編碼就是"E6B8ACE8A9A6E794A8E5B8B3E8999F"。這樣起碼可以確定,你的mysql中保存的是正確的utf8編碼。

中文亂碼有些奇怪,因爲"E6B8ACE8A9A6E794A8E5B8B3E8999F"的latin1編碼是"測試用帳號",你貼出來的不知爲何少了前兩位,不知是貼的時候漏掉了,還是就是沒有這兩位?

現在看來有兩個可能:
1。我看你的第一篇文章提到,
HEICZG 寫:而再往下看 資料表的就開始怪怪的了@@ 怎麼欄位編碼為採用latin1
會不會是因爲這個問題?存入mysql的是正確的utf8編碼,但是由于欄位編碼為latin1,所以phpMyAdmin就把它們解釋成了latin1,展示出來,自然就是亂碼了。要是這種情况,不妨把欄位編碼改爲utf8試試。注意:改動之前最好做備份,不然資料可能丟失!印象裏你是自己的機器,可以用直接拷貝文件的方式麳備份,mysql的數據目錄一般是在安裝目錄下的var或者data目錄中,一個數據庫就是一個目錄,裏面每個表對應3個文件,.frm, .MYD和.MYI,直接拷貝下來就行。

2。如果還是不行,會不會是phpMyAdmin有問題?前面有朋友提到,要設置“AllowAnywhereRecoding”,不知你有沒有試試看?或者乾脆換個其他版本的phpMyAdmin試試

另外,不知怎麽回事:?:,你貼的圖我都看不到,所以很多你提供的信息都沒有辦法得到:(
HEICZG
星球公民
星球公民
文章: 41
註冊時間: 2004-03-08 20:13

文章 HEICZG »

chiouss 寫:
HEICZG 寫:之前是有把他全改成顯示為utf8 但後來弄不定又把他還原成latin1
不曉得有沒有影響@@
改來改去裡面存的資料會爛掉,不然就不會要求要先 mysqldump 出來轉碼再塞回去了。
你誤會這句話的意思了..
我指的還原回去 是指還原到最原始..而非匯出再匯入..又改編碼等等之類的@@

我有留下一開始最早dump出來的資料 以供測試及找問題用@@"

目前的資料已經多到足夠我慢慢消化參考了 感謝大家
只是最近比較忙了點 不是都不試 而是要等到假日才有空測試 ^^"

也不是一直上來問 只是有人願意幫我解決...不回文對不起
才會變成一直回文 真的很抱歉
●架設主機作業系統:Linux Fedora Core 5
●快速架站程式:無
●您的上網方式:HINET ADSL 2M/512K(1固定,7浮動)
●您的 phpBB2 版本:phpBB 2.0.2.1
●您的 domain(網域名稱) :ffxi.servehttp.com
●您的 phpBB2 連結網址:http://ffxi.servehttp.com/
Hower
星球普通子民
星球普通子民
文章: 8
註冊時間: 2004-09-28 05:54

文章 Hower »

HEICZG您好,依據您發文所述,您的安裝環境為下:
)phpbb:2.0.21 Utf-8版
)mysql:5.0.18
)phpMyAdmin:2.8.2

而我的安裝還境為(且phpbb皆為全新安裝):
)Apache:2.0.58
)phpbb:2.0.21 Utf-8版
)mysql:5.0.22
)phpMyAdmin:2.8.2

因此我也遇到了您所提到的問題,
在網路上搜尋相關問題,其所述內容類似如下:

1.建立新 database時,charset(選擇utf8),collation(選擇utf8_general_ci),
(此部份相信您有做到,但問題仍然存在.)

2.修改my.ini
[mysqld]
default-character-set=utf8

[client]
default-character-set=utf8
init_connect='SET NAMES utf8'
(此部份修改後,問題仍然存在.)

3.安裝phpbb2前,開啟編輯phpbb2/includes/db.php ,並於最下方?>前加入:

代碼: 選擇全部

$db->sql_query("SET NAMES utf8;"); 
使用此辦法,即可以在phpMyAdmin與前端頁面中,皆正常顯示中文

註:小弟對web design(flash,css,html,)較熟悉,
對動態網頁,資料庫等並無全盤性的基礎與概念,因此提出的解決辦法可能,
只是制標而已,而chiouss先生所提到的AllowAnywhereRecoding,
小弟會再嘗試搜查相關資料,不足之處請見諒.
chiouss
竹貓忠實會員
竹貓忠實會員
文章: 1741
註冊時間: 2002-11-29 18:19

文章 chiouss »

Hower 寫:init_connect='SET NAMES utf8'
(此部份修改後,問題仍然存在.)

3.安裝phpbb2前,開啟編輯phpbb2/includes/db.php ,並於最下方?>前加入:

代碼: 選擇全部

$db->sql_query("SET NAMES utf8;"); 
使用此辦法,即可以在phpMyAdmin與前端頁面中,皆正常顯示中文
phpMyAdmin 新一點的版本不需要做這些設定就會自己送 charset 去告訴 server 才對。

至於加了 init_connect 還不會正確顯示的原因可能有兩種,一是你沒有重跑 mysqld,二是你 phpbb 用的 mysql user 有 root 權限,所以 init_connect 不會作用。

要多研究很歡迎,下面連結的文件裡面都可以找到很詳細的資料。AllowAnywhereRecoding 我在站上也有寫過一篇爛爛的文章說明,不嫌棄的話就參考看看吧。
回覆文章

回到「phpMyAdmin」