MySQL字符集編碼設定與PHP顯示亂碼的解決辦法

2022-05-06 04:21:09 字數 2552 閱讀 6684

**:部落格水木

它設定了瀏覽器端採用gb2312的字符集,此時如果程式使用的是utf8的編碼(就是指以什麼樣的編碼來編寫的程式,一般在編輯器中設定),那麼就會產生亂碼。

此時的解決方法就是把charset的值改為utf-8。

2、**本身就存在亂碼問題

這種情況是指你的**本身就存在亂碼問題。照成這種情況的原因一般是你以另一種編碼格式修改了你的**後並做了儲存,這樣你的程式中就有幾種編碼形式的**,那麼輸出的時候自然就會有亂碼。這類問題相對來說比較容易解決,只要人工找到那段有亂碼的**,然後修改就行了(很多編輯器可以完成這個工作)。

3、mysql的問題(此次討論僅圍繞mysql5.0之後的版本展開)

現在再來看最容易照成亂碼,也是最容易讓人迷糊的mysql亂碼問題。

要說mysql亂碼,得先從mysql的幾個引數說起,從mysql5開始,多了幾個設定字符集的系統變數:

character_set_client  客戶端字符集

character_set_connection 客戶端與伺服器端連線採用的字符集

character_set_results  select查詢返回資料的字符集

character_set_database 資料庫採用的字符集

亂碼問題一般是由於以上幾個變數設定錯誤照成的,很多人在請教亂碼問題的時候,一般都會得到乙個這樣的答案:「你先set names一下」。

那麼set names是什麼呢? set names實際上就是同時設定了character_set_client,character_set_connection,character_set_results這三個系統變數。

例如set names 'utf8'等同於:

set @@character_set_client = 'utf8'

set @@character_set_connection = 'utf8'

set @@character_set_results = 'utf8'

很多情況下,在連線資料庫之後,讀取資料之前,先執行一項查詢「set names utf8」,即在php裡為:

mysql_query("set names utf8");

即可顯示正常(只要資料庫裡資訊的字元正常)。這樣設定了之後就能把亂碼問題解決了。

但是還是不能完全避免出現亂碼的可能,為什麼呢?

因為character_set_client,character_set_connection這兩個變數僅用與保證與character_set_database編碼的一致,而character_set_results則用與保證select返回的結果與程式的編碼一致。

例如,你的資料庫(character_set_database)用的是utf8的字符集,那麼你就要保證character_set_client,character_set_connection也是utf8的字符集。而你的程式也許採用的並不是utf8,比如你的程式用的是gbk,那麼你若把character_set_results也設定為utf8的話就會出現亂碼問題。此時你應該把character_set_results設定為gbk。這樣就能保證資料庫返回的結果與你的程式的編碼一致。

下面我給出一段用於設定字符集的**(其中用到了乙個我自己寫的db庫,相信應該不影響閱讀):

<?

//假設我們的程式採用的是utf8的字符集

$program_char = 'utf8';

//先檢查mysql的版本號,如果版本號大於4我們才可以設定這些系統變數(mysql4還沒有這些系統變數)

$version = current($db->fetch_one('select version()'));

if (substr($version, 0, 1) > 4)

?>

到此應該就可以解決絕大多數我們遇到的亂碼問題了,另外還必須強調的是,有時候亂碼的出現有可能是以上幾種原因混合造成的。

對於這樣的問題處理起來就比較的麻煩。因為首先要保證你在資料庫中儲存的資料的字符集與資料庫的字符集是一致的。如果你在乙個utf8的資料庫中儲存了gbk字元資料(如果你頁面的編碼與資料庫的編碼不一致,那麼產生這個問題的可能性就很大),那麼假設以上的設定都正確,結果還是會出現亂碼的問題。不過這類問題一旦確定了產生的原因,那麼就還是有辦法解決的,比如剛才我舉的這個例子。

我們如果能確保其他環節的設定都是正確的,並且能夠確認是由於把gbk的資料存到了utf8的資料庫中而造成的亂碼,那麼我就可以把這些資料從資料庫中取出來之後再用iconv()轉換編碼也是可以的。

總而言之,我們應當盡量的保證資料庫中的資料是正確的,那麼問題處理起來就相對簡單了。

說了一大堆可能把你給弄迷糊了,我將其總結為以下四點,便於大家記憶。

1、要保證資料庫中存的資料與資料庫編碼一致,即資料編碼與character_set_database一致;

2、要保證通訊的字符集與資料庫的字符集一致,即character_set_client, character_set_connection與character_set_database一致;

3、要保證select的返回與程式的編碼一致,即character_set_results與程式編碼一致;

4、要保證程式編碼與瀏覽器編碼一致,即程式編碼與一致。

mysql字符集編碼

檢視編碼字符集 show variables like collation show variables like character set 在命令列修改字元編碼 例如gb3212 set character set client gb2312 客戶端編碼方式 set character set ...

mysql 設定 編碼字符集 過程

本文從關閉資料庫開始講解如何設定mysql的編碼字符集,解決亂碼問題 關於在從客戶端到資料庫伺服器之間編碼轉換的過程可以參考這篇 設定字符集流程 1.關閉資料庫 service mysqld stop 2.修改my.cnf檔案設定預設字符集 linux該檔案一般在 etc my.cnf 沒有的話手動...

字符集與編碼

前言 今天notepad 檢視測試傳過來的乙個log,開啟後竟然有部分亂碼,無法檢視完整資訊,嘗試更改編碼後仍未能解決,同事告知使用瀏覽器開啟或許可以,於是搗鼓一下,使用瀏覽器開啟並選擇編碼unicode utf 8 後終於正常顯示,順利解決問題。亂碼顯示的問題以前也經常遇到,從未認真對待過,剛好稱...