from:http://hi.baidu.com/wszxg8866/blog/item/023e3e32f6ada3ff1b4cff34.html

mysql+php產(chǎn)生亂碼原因:
  1. mysql數(shù)據(jù)庫默認的編碼是utf8,如果這種編碼與你的PHP網(wǎng)頁不一致,可能就會造成MYSQL亂碼.
  2. MYSQL中創(chuàng)建表時會讓你選擇一種編碼,如果這種編碼與你的網(wǎng)頁編碼不一致,也可能造成MYSQL亂碼.
  3. MYSQL創(chuàng)建表時添加字段是可以選擇編碼的,如果這種編碼與你的網(wǎng)頁編碼不一致,也可能造成MYSQL亂碼.
  4. 用戶提交頁面的編碼與顯示數(shù)據(jù)的頁面編碼不一致,就肯定會造成PHP頁面亂碼.
  5. 如用戶輸入資料的頁面是big5碼, 顯示用戶輸入的頁面卻是gb2312,這種100%會造成PHP頁面亂碼.
  6. PHP頁面字符集不正確.
  7. PHP連接MYSQL數(shù)據(jù)庫語句指定的編碼不正確.
注意:
        很多人都懷疑mysql版本不一致會導致亂碼,相信看了本說明你就不會這樣認為了.
          平時你在某些網(wǎng)站看到的文字可能有幾種編碼, 如你看到一個繁體字,它有可能是big5編碼,也有 可能是utf-8編碼的,更有可能是gb碼的,沒錯,也就是說有簡體編碼的繁體字,也有繁體編碼的簡體字,一定要了解這一點.
如果你是做一個簡體編碼的網(wǎng)頁,編碼定為GB2312,如果有香港和臺灣地區(qū)的訪客提交繁體的信息,就可能會造成亂碼,解決方法:
  • 將網(wǎng)站編碼設為 utf-8,這樣可以兼容世界上所有字符,
  • 如果網(wǎng)站已經(jīng)運作了好久,已有很多舊數(shù)據(jù),不能再更改簡體中文的設定,那么建議將頁面的編碼設為 GBK, GBK與GB2312的區(qū)別就在于:GBK能比GB2312顯示更多的字符,要顯示簡體碼的繁體字,就只能用GBK. 

  •          使用mysql+php產(chǎn)生亂碼的原因都了解得很清楚了,那么解決就不困難了.

    mysql+php產(chǎn)生亂碼的解決辦法:

  1. 如果安裝mysql的編碼已不能更改,很多朋友是購買虛擬主機建立網(wǎng)站,無權更改MYSQL的安裝編碼,這一關我們可以跳過,因為只要后面的步聚正確,一樣能解決亂碼問題
  2. 修改數(shù)據(jù)庫編碼,如果是數(shù)據(jù)庫編碼不正確,可以在phpmyadmin 執(zhí)行如下命令:

    ALTER DATABASE 'test' DEFAULT CHARACTER SET utf8 COLLATE utf8_bin
    以上命令就是將test數(shù)據(jù)庫的編碼設為utf8.
  3. 修改表的編碼:

    ALTER TABLE 'category' DEFAULT CHARACTER SET utf8 COLLATE utf8_bin
    以上命令就是將一個表category的編碼改為utf8.
  4. 修改字段的編碼:

    ALTER TABLE 'test' CHANGE 'dd' 'dd' VARCHAR( 45 ) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL
    以上命令就是將test表中 dd的字段編碼改為utf8.
  5. 如果是這種情況容易解決,只需檢查下頁面,修改源文件的charset即可.
  6. 這種情況也是修改頁面charset即可.
  7. 在連接數(shù)據(jù)庫的語句中.
                          mysql_connect('localhost','user','password');
                          mysql_select_db('my_db');
                          mysql_query("set names utf8;");     //select 數(shù)據(jù)庫之后加多這一句

                          為了避免PHP頁面亂碼的發(fā)生,PHP頁面開始第一句
                          header("content-type:text/html; charset=utf-8");
                          //強行指定頁面的編碼,以避免亂碼