是的 字符集必須設(shè)置統(tǒng)一,中途也可以設(shè)置就看你會(huì)不會(huì)中途設(shè)置的方法。
創(chuàng)新互聯(lián)公司專(zhuān)注于企業(yè)全網(wǎng)整合營(yíng)銷(xiāo)推廣、網(wǎng)站重做改版、雄縣網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、H5高端網(wǎng)站建設(shè)、商城建設(shè)、集團(tuán)公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁(yè)設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為雄縣等各大城市提供網(wǎng)站開(kāi)發(fā)制作服務(wù)。
php+mysql的utf-8中文亂碼問(wèn)題的解決方法
問(wèn)題匯總:
1.mysql數(shù)據(jù)庫(kù)默認(rèn)的編碼是utf8,如果這種編碼與你的PHP網(wǎng)頁(yè)不一致,可能就會(huì)造成MYSQL亂碼.
2.MYSQL中創(chuàng)建表時(shí)會(huì)讓你選擇一種編碼,如果這種編碼與你的網(wǎng)頁(yè)編碼不一致,也可能造成MYSQL亂碼.
3.MYSQL創(chuàng)建表時(shí)添加字段是可以選擇編碼的,如果這種編碼與你的網(wǎng)頁(yè)編碼不一致,也可能造成MYSQL亂碼.
4.用戶提交頁(yè)面的編碼與顯示數(shù)據(jù)的頁(yè)面編碼不一致,就肯定會(huì)造成PHP頁(yè)面亂碼.
5.如用戶輸入資料的頁(yè)面是big5碼, 顯示用戶輸入的頁(yè)面卻是gb2312,這種100%會(huì)造成PHP頁(yè)面亂碼.
6.PHP頁(yè)面字符集不正確.
7.PHP連接MYSQL數(shù)據(jù)庫(kù)語(yǔ)句指定的編碼不正確.
使用mysql+php產(chǎn)生亂碼的原因都了解得很清楚了,那么解決就不困難了.
針對(duì)不同問(wèn)題的解決方法:
1.mysql數(shù)據(jù)庫(kù)默認(rèn)的編碼是utf8,如果這種編碼與你的PHP網(wǎng)頁(yè)不一致,可能就會(huì)造成MYSQL亂碼.
修改數(shù)據(jù)庫(kù)編碼,如果是數(shù)據(jù)庫(kù)編碼不正確,可以在phpmyadmin 執(zhí)行如下命令:
Alter DATABASE 'test' DEFAULT CHARACTER SET utf8 COLLATE utf8_bin
以上命令就是將test數(shù)據(jù)庫(kù)的編碼設(shè)為utf8.
2.MYSQL中創(chuàng)建表時(shí)會(huì)讓你選擇一種編碼,如果這種編碼與你的網(wǎng)頁(yè)編碼不一致,也可能造成MYSQL亂碼.
修改表的編碼:
Alter TABLE 'category' DEFAULT CHARACTER SET utf8 COLLATE utf8_bin
以上命令就是將一個(gè)表category的編碼改為utf8.
3.MYSQL創(chuàng)建表時(shí)添加字段是可以選擇編碼的,如果這種編碼與你的網(wǎng)頁(yè)編碼不一致,也可能造成MYSQL亂碼.
修改字段的編碼:
Alter TABLE 'test' CHANGE 'dd' 'dd' VARCHAR( 45 ) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL
以上命令就是將test表中 dd的字段編碼改為utf8.
4.用戶提交頁(yè)面的編碼與顯示數(shù)據(jù)的頁(yè)面編碼不一致,就肯定會(huì)造成PHP頁(yè)面亂碼.
如果是這種情況容易解決,只需檢查下頁(yè)面,修改源文件的charset即可.
5.如用戶輸入資料的頁(yè)面是big5碼, 顯示用戶輸入的頁(yè)面卻是gb2312,這種100%會(huì)造成PHP頁(yè)面亂碼.
這種情況也是修改頁(yè)面charset即可.
6.PHP頁(yè)面字符集不正確.
為了避免PHP頁(yè)面亂碼的發(fā)生,PHP頁(yè)面開(kāi)始第一句
header("content-type:text/html; charset=utf-8");
//強(qiáng)行指定頁(yè)面的編碼,以避免亂碼
7.PHP連接MYSQL數(shù)據(jù)庫(kù)語(yǔ)句指定的編碼不正確.
在連接數(shù)據(jù)庫(kù)的語(yǔ)句中.
mysql_connect('localhost','user','password');
mysql_select_db('my_db');
mysql_query("set names 'utf8'"); //select 數(shù)據(jù)庫(kù)之后加多這一句
字符集很簡(jiǎn)單,但是數(shù)據(jù)的排序需要通過(guò)SQL語(yǔ)句來(lái)協(xié)助完成,ORDER BY 語(yǔ)句,代碼如下:
//?假設(shè)你已經(jīng)成功連接了數(shù)據(jù)庫(kù)($mysqli變量假設(shè)為連接的資源句柄)
//?通過(guò)對(duì)象方式設(shè)置字符編碼
$mysqli?-?set_charset('utf8');
//?通過(guò)函數(shù)方式設(shè)置字符編碼
mysqli_set_charset($mysqli,?'utf8');
//?那么接下來(lái)是數(shù)據(jù)排序的話,需要編寫(xiě)一條SQL查詢語(yǔ)句(DESC?倒序排列?|?ASC?正序排列)
$sql?=?"SELECT?`字段`?FROM?`表名`?WHERE?TRUE?ORDER?BY?`字段`?DESC;";
如果還有什么問(wèn)題,歡迎追問(wèn)~
以前的國(guó)外主機(jī)用的Mysql是4.x系列的,感覺(jué)還比較好,都無(wú)論GBK和UTF-8都沒(méi)有亂碼,沒(méi)想到新的主機(jī)的Mysql是5.0版本的,導(dǎo)入數(shù)據(jù)后,用Php讀出來(lái)全是問(wèn)號(hào),亂碼一片,記得我以前也曾經(jīng)有過(guò)一次切換出現(xiàn)亂碼的經(jīng)驗(yàn),原因肯定是Mysql版本之間的差異問(wèn)題。
只好查資料,發(fā)現(xiàn)了一個(gè)解決方法,就是在mysql_connect后面加一句SET NAMES UTF8,即可使得UTF8的數(shù)據(jù)庫(kù)消除亂碼,對(duì)于GBK的數(shù)據(jù)庫(kù)則使用SET NAMES GBK,代碼如下:
$mysql_mylink = mysql_connect($mysql_host, $mysql_user, $mysql_pass);
mysql_query("SET NAMES 'GBK'");
和Mysql類(lèi)里面的用法一樣,他們只過(guò)不過(guò)是我們鏈接數(shù)據(jù)庫(kù)的中間橋梁變了,本質(zhì)并沒(méi)有變,還是對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作,而操作的要利用SQL語(yǔ)句,所以這里可以用同樣的mysql語(yǔ)句即可,只不過(guò)執(zhí)行函數(shù)變了!在mysql類(lèi)里面,我們用mysql_query(“SET NAMES gbk”);設(shè)置字符集編碼為gbk啦!在PDO里面我們用$db-query("SET NAMES gbk");當(dāng)然也有其他的函數(shù)也可以。這里有百度文庫(kù)關(guān)于PDO的解釋和簡(jiǎn)單使用!