PHP存取MySQL 數(shù)據(jù)亂碼的破解
以下的文章主要向大家介紹的是PHP存取MySQL 數(shù)據(jù)亂碼的實(shí)際解決方法我們大家都知道MySQL 數(shù)據(jù)中出現(xiàn)亂碼是一件令人十分頭痛的的事情,那么到底對(duì)其如何解決呢?以下的文章就有解答。
對(duì)PHP和MySQL 的研究并不深入,以下是我的一些個(gè)人心得,說的可能不是很明白,但確實(shí)是很管用的東西。
我的Discuz版本是UTF-8的,但是打開phpmyadmin顯示的是 整理欄目:gbk_chinese_ci ,而且查看數(shù)據(jù)顯示完全正常,沒有亂碼,這個(gè)表示,實(shí)際 discuz在存取數(shù)據(jù)庫(kù)用的是 gbk編碼,但頁(yè)面顯示確實(shí)UTF-8編碼阿,怎么沒有MySQL 數(shù)據(jù)亂碼呢?難道Discuz做了編碼轉(zhuǎn)換。
最近在公司開發(fā)一個(gè)網(wǎng)站,由于用到了 cakephp框架 ,默認(rèn)編碼為UTF-8,而且我的計(jì)算機(jī)是Ubuntu,通常用的都是UTF-8編碼,所寫的程序頁(yè)面也都是UTF-8編碼的文件,自然想到用UTF-8編碼的數(shù)據(jù)庫(kù),這個(gè)問題可把我苦大了。
按照一般網(wǎng)上的說法是建立數(shù)據(jù)庫(kù)表的時(shí)候加上 DEFAULT CHARSET UTF8 ,創(chuàng)建的表的整理欄目在phpmyadmin里面顯示的 是 utf8_general_ci ,在執(zhí)行sql 語句是加上“set names utf8”,這樣就會(huì)正常了,插入的數(shù)據(jù)在頁(yè)面里面顯示完全正常,我的頁(yè)面是 設(shè)置了UTF-8編碼的 ,<meta http-equiv="content-type" content="text/html; charset=UTF-8" /> 。
按理說應(yīng)該沒有什么問題的,但是在Phpmyadmin里面顯示的確是MySQL 數(shù)據(jù)亂碼,而且如果我在phpmyadmin里面修改了一個(gè)數(shù)據(jù),在phpmyadmin里面顯示就是正常了,但是到頁(yè)面顯示卻亂碼了,于是我想?yún)⒖家幌耫iscuz的做法在phpmyadmin里面強(qiáng)行把表和所有的char,varchar 和 text 字段改為gbk_chinese_ci ,修改后,phpmyadmin 里面正常了,但是到頁(yè)面顯示確是MySQL 數(shù)據(jù)亂碼了,公司原來的數(shù)據(jù)庫(kù)是 ms-sql server 2000 的現(xiàn)在要導(dǎo)入到 MySQL5,原來的 兩個(gè)漢字在導(dǎo)入到 char(10)的時(shí)候 竟然報(bào)錯(cuò)說是字符太長(zhǎng)了,怎么可能呢?
一個(gè)字符按照UTF16也就4個(gè)字節(jié) 最多才到8個(gè)字節(jié)阿怎么回事阿?網(wǎng)上有人說是由于編碼不當(dāng)可能會(huì)把UTF8的編碼經(jīng)過兩次轉(zhuǎn)換 變成一個(gè)漢字6個(gè)字節(jié)存儲(chǔ),具體是怎么回事我也不清楚,不過后來經(jīng)過多次實(shí)驗(yàn)終于明白了原來MySQL存取編碼和查詢編碼并不一致,需要手動(dòng)指定,也可以在 MySQL 的配置文件里指定編碼網(wǎng)上有人的解決辦法是:
PHP源文件使用的是UTF-8編碼 MySQL 存儲(chǔ)用的是GBK編碼
- set character_set_client = utf8;
指明也即php程序發(fā)往數(shù)據(jù)庫(kù)的SQL語句使用的是UTF8編碼,如insert;
- set character_set_connection = GBK;
指明數(shù)據(jù)庫(kù)收到SQL語句之后應(yīng)當(dāng)將其從character_set_client轉(zhuǎn)碼為
utf8格式進(jìn)行操作,如insert。(若沒有這一句,插入的數(shù)據(jù)將變成問號(hào))
- set character_set_results = utf8;
指明數(shù)據(jù)庫(kù)查詢完畢之后應(yīng)當(dāng)以何種編碼返回給調(diào)用端,如select。
現(xiàn)在***解決辦法,php 文件為UTF-8時(shí)的做法:在所有執(zhí)行MySQL_query函數(shù)做數(shù)據(jù)庫(kù)插入刪除查詢之前 執(zhí)行下面三個(gè)命令:
- MySQL_query('set character_set_client = utf8');
- MySQL_query('set character_set_connection = GBK');
- MySQL_query('set character_set_results = utf8');
而不是以前的 set names utf8命令創(chuàng)建數(shù)據(jù)庫(kù)和創(chuàng)建表之時(shí)指定編碼為gbk ,指定 整理為:
- gbk_chinese_ci;
- CREATE DATABASE `test` DEFAULT CHARACTER SET gbk COLLATE gbk_chinese_ci;
這樣你的網(wǎng)站永遠(yuǎn) 都不會(huì)有MySQL 數(shù)據(jù)亂碼問題了而且如果有一個(gè)字段是 username char(20),這樣就可以插入20個(gè)漢字,而不是20/2或者 20/3之類如果插入的是20個(gè)漢字, select length(username)查看 會(huì)返回 40 ,也就是說,MySQL 實(shí)際是用40個(gè)字符存儲(chǔ)的但是我們不用去管他實(shí)際的存儲(chǔ),你想要限制多少就直接是指定char()多少就可以了,漢字和英文同樣對(duì)待。
【編輯推薦】