回 ACSite.NET 首頁
回 ACSite.NET 首頁 客服系統 帳務系統 英文首頁
nav_seperator
nav_seperator
nav_seperator
nav_seperator
 

頁: 1 2 3 [4]
  列印  
作者 主題: 資料庫變亂碼  (閱讀 86399 次)
whosee
客戶
***
離線 離線

文章: 136


« 回覆文章 #45 於: 五月 19, 2010, 07:51:14 am »

還是有點問題
最近我又建一個資料庫rgbook
其資料表GuestBook還是亂碼

但是奇怪的是
這些亂碼在utf-8編碼的網頁上
顯示又很正常
換言之
資料表的內容編碼(utf-8)是沒問題的

那是不是CPanel本身網頁編碼設定的問題?
但是我查CPanel網頁編碼設定也是utf-8
而且其他資料庫(例如wp001)也沒有問題

敬請再協助解決
謝謝!
已記錄
acsite
管理員
Hero Member
*****
離線 離線

文章: 4,027


個人網站
« 回覆文章 #46 於: 五月 19, 2010, 10:42:51 am »

rgbook 也是使用 http://pma.cp15.secserverpros.com/ 即可正常顯示中文
rgbook 之所以無法使用 cPanel 內建的 phpMyAdmin 顯示中文
是因為您的程式寫入資料時使用 latin 編碼所致
請您加上 mysql_query("SET NAMES 'utf8'"); 才能讓程式改用 UTF8 讀寫資料
相關說明請參考以下網址
http://ria.richtechmedia.com/2005/12/19/%E3%80%90%E4%BF%9D%E8%A8%BC%E6%88%90%E5%8A%9F%E3%80%91%E7%9A%84-mysql-%E4%B8%AD%E6%96%87%E4%BA%82%E7%A2%BC%E8%A7%A3%E6%B1%BA%E6%96%B9%E6%A1%88/
已記錄
whosee
客戶
***
離線 離線

文章: 136


« 回覆文章 #47 於: 五月 20, 2010, 09:11:48 am »

$link = mysql_connect($host, "xxx", "xxx");
mysql_query("SET NAMES 'utf8'");

在建立(連結)資料表時
加上這一行問題就解決了 奸笑

但是已經建立的資料表
加上這一行問題就更嚴重
連網頁上原來正常顯示的資料
通通都會變成亂碼

問題總算是解決了
謝謝!
已記錄
acsite
管理員
Hero Member
*****
離線 離線

文章: 4,027


個人網站
« 回覆文章 #48 於: 五月 20, 2010, 09:47:50 am »

但是已經建立的資料表
加上這一行問題就更嚴重
連網頁上原來正常顯示的資料
通通都會變成亂碼

之前已經建立的資料表
因為當時 php 使用 latin 編碼寫入資料
如果以 latin 編碼讀資料,latin 進 latin 出,這樣就不會有問題
但是若加上 set name 改用 utf8,變成 latin 進 utf8 出,網頁就會立刻變成亂碼 微笑
已記錄
whosee
客戶
***
離線 離線

文章: 136


« 回覆文章 #49 於: 五月 20, 2010, 12:04:15 pm »

其實我還是有很多疑惑的...

1.從phpMyAdmin中去設定字集似乎是無效的
  如果靠的只是這一行程式
   mysql_query("SET NAMES 'utf8'");
   那麼phpMyAdmin中設定字集的功能又是做什麼用的呢?

2.中文是否只有BIG5和UTF8這二種編碼?
  怎麼又有latin這樣的編碼?
  我現在資料表裡的中文
  到底是哪一種編碼?

3.我網頁用的是UTF8的編碼
  為什麼這些中文可以在網頁上正常顯示?
  卻在server端的資料表裡變成亂碼?

4.對於目前資料表裡的內容
  可否用匯出=>轉碼=>匯入的方式
  讓它一致性的通通不再出現亂碼?

謝謝了!
已記錄
acsite
管理員
Hero Member
*****
離線 離線

文章: 4,027


個人網站
« 回覆文章 #50 於: 五月 20, 2010, 02:32:43 pm »

編碼只是一個將文字資料轉換成二進位碼的系統
只要讀寫雙方約定好,不管使用 latin 或是任何編碼都可以

舊版本的 php 程式讀寫資料庫的流程如下:

正常中文字 ---> (用 latin1 格式寫入) ---> 10110
正常中文字 <--- (用 latin1 格式讀取) <--- 10110

如果SET NAMES 'utf8' 之後再讀上面的資料:
亂碼 <--- (用 utf8 格式讀取) <--- 10110

雖然 phpMyAdmin 可以設定連線校對
但是不論您設定哪一種校對
您可以看一下瀏覽器使用的編碼都是 utf8
表示 phpMyAdmin 讀出資料後,會統一將資料轉成 utf8
所以就算是設定 phpMyAdmin 的連線校對為 latin1,仍然會顯示亂碼:

亂碼 <-- (將 latin1 轉成 utf8) <-- 正常中文字 <--- (用 latin1 格式讀取) <--- 10110

您可以將舊資料庫的資料匯出
將資料庫的校對改成 ut8
然後再匯入資料即可改成正確的編碼
不過請注意舊版本的 phpbb 沒有 mysql_query("SET NAMES 'utf8'");
您必須自行修改 phpbb 的程式碼
已記錄
whosee
客戶
***
離線 離線

文章: 136


« 回覆文章 #51 於: 五月 20, 2010, 07:33:04 pm »

如果亂嗎是這樣造成的:
正常中文字 ---> (用 latin1 格式寫入) ---> 10110

那麼除非用 latin1 格式讀回來
否則亂碼還是亂碼
匯出來的還是亂碼
所以匯入的也是亂碼

至於以下的說法似乎也不成立:
亂碼 <-- (將 latin1 轉成 utf8) <-- 正常中文字 <--- (用 latin1 格式讀取) <--- 10110

實際上應該是:
正常中文字<-- (網頁編碼設為utf8) <-- 中文字(utf8)<--- (用 latin1 格式讀取) <--- 10110

還有一個很有趣的現象
10110<-- (網頁編碼設為西歐語系ISO) <-- 中文字(utf8)<--- (用 latin1 格式讀取) <--- 10110
前後的亂碼居然是一模一樣的 啥

mysql_query("SET NAMES 'utf8'");
這個指令確實作用很大
完全決定資料表的寫入和讀取的編碼
已記錄
acsite
管理員
Hero Member
*****
離線 離線

文章: 4,027


個人網站
« 回覆文章 #52 於: 五月 20, 2010, 10:00:33 pm »

亂碼 <-- (將 latin1 轉成 utf8) <-- 正常中文字 <--- (用 latin1 格式讀取) <--- 10110

上面這個是指新版 phpMyAdmin 的作法
因為您詢問「從phpMyAdmin中去設定字集似乎是無效的」
所以我們才會特別說明新版 phpMyAdmin 的作法
這樣的作法和一般 php 程式讀資料的流程是不一樣的
因此舊版 phpbb 可以用 latin1 格式讀出正常中文字
但是新版的 phpMyAdmin 即使設定為 latin1
還是無法讀出正常的中文字
已記錄
whosee
客戶
***
離線 離線

文章: 136


« 回覆文章 #53 於: 五月 20, 2010, 11:14:56 pm »

現在的問題不是讀不出來正常的中文字
誠如前面討論到的
因為不管用什麼編碼
寫入和讀出只是一種零和的過程
所以在網頁上顯示的都是正常的
(這應該和phpMyAdmin版本無關)

現在的問題是在這零和過程的前半段
亦即將utf8中文用latin編碼過的亂碼
如何能夠直接在資料庫中將之正常化?
(這可能就和phpMyAdmin的版本有關)
已記錄
acsite
管理員
Hero Member
*****
離線 離線

文章: 4,027


個人網站
« 回覆文章 #54 於: 五月 21, 2010, 03:09:23 am »

您可以使用舊版本的 phpMyAdmiin http://pma.cp15.secserverpros.com/utf8/
即可正常看到 _kjsql 與 _phpb1 資料庫內的中文字

如果您希望在 cPanel 的新版本 phpMyAdmiin 看到 _kjsql 與 _phpb1 資料庫內的中文字
可以將  _kjsql 與 _phpb1 資料庫用匯出=>轉碼=>匯入的方式
轉換成正常的 utf8 編碼

已記錄
whosee
客戶
***
離線 離線

文章: 136


« 回覆文章 #55 於: 五月 21, 2010, 08:34:43 am »

終於畫下了完美的句點 ㄏㄏㄏ

經過這一系列的討論
確實學到不少東西

感謝acsite詳盡與熱心的協助
已記錄
whosee
客戶
***
離線 離線

文章: 136


« 回覆文章 #56 於: 五月 21, 2010, 09:07:56 am »

我得到一個粗淺的結論:

如果沒有特殊設定
資料庫內容都是透過內定的latin編碼進出
所以舊版phpMyAdmin處理資料顯示方式
也就自然而然的用latin編碼把它還原回來

現在資料庫內容的進出編碼比較多元(例如utf8)
所以新版phpMyAdmin處理資料顯示方式
就讓它保持原貌

以上僅止於在phpMyAdmin顯示的方式
至於實際上網頁的顯示
只要程式在資料進出處理上是一致的
資料內容都會正常顯示
已記錄
acsite
管理員
Hero Member
*****
離線 離線

文章: 4,027


個人網站
« 回覆文章 #57 於: 五月 21, 2010, 10:02:59 am »

所以舊版phpMyAdmin處理資料顯示方式
也就自然而然的用latin編碼把它還原回來

現在資料庫內容的進出編碼比較多元(例如utf8)
所以新版phpMyAdmin處理資料顯示方式
就讓它保持原貌

我個人的認知如下  微笑

舊版 phpMyAdmin 以 latin1 格式讀出來後
就直接秀在網頁上,所以可以正常顯示 latin1 資料庫內的中文

新版 phpMyAdmin 以 latin1 格式讀出來後
偷偷加工,將原本讀出來已經正常的中文字以「latin1->utf8」的方式又重新編碼
(這個偷加工的方式和您說的「網頁編碼設為西歐語系ISO」是類似的)
然後才秀在網頁上,所以看到的是亂碼
已記錄
whosee
客戶
***
離線 離線

文章: 136


« 回覆文章 #58 於: 五月 22, 2010, 11:34:34 am »

單純以網頁瀏覽而言
只有網頁程式和MySQL的互動
phpMyAdmin是不相干的局外者
所以不管有沒有phpMyAdmin
都不影響網頁正常的顯示

當網頁程式加上 mysql_query("SET NAMES 'utf8'"); 這一段程式碼
改變的只是MySQL的資料處理方式
phpMyAdmin只是跟著MySQL的改變來選擇它的顯示方式

目前的現況是
無論舊版或者新版都不能智慧的顯示所有不同狀況下的編碼
舊版自無話說
新版為什麼也不能呢?
我想最重要的原因應該是
作為一個資料庫管理程式
保持資料的原貌顯示應該勝於一切的
否則僅為了方便閱讀而改變顯示(實質內容並沒有改變)
那麼當使用者在不知情的情況下
直接在phpMyAdmin管理網頁上
使用增新或者更改功能
可能就會造成新舊資料編碼錯亂的問題

很感謝acsite熱心幫助解決了我的問題
更感謝他還在百忙中參與這個後續的討論
已記錄
acsite
管理員
Hero Member
*****
離線 離線

文章: 4,027


個人網站
« 回覆文章 #59 於: 五月 24, 2010, 01:48:32 pm »

不客氣 微笑
新版 phpMyAdmin 可能是為了統一用 utf8 輸出
所以才會另外偷偷加工
不過詳細原因可能要問 phpMyAdmin 的研發者才會知道了 ㄏㄏㄏ
已記錄
頁: 1 2 3 [4]
  列印  
 
前往:  



 
 
bottom
Copyright © 2002 - 2017 ACSite.NET All Rights Reserved.