程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> PHP存取MySQL 數據亂碼的破解

PHP存取MySQL 數據亂碼的破解

編輯:MySQL綜合教程

以下的文章主要向大家介紹的是PHP存取MySQL 數據亂碼的實際解決方法我們大家都知道MySQL 數據中出現亂碼是一件令人十分頭痛的的事情,那麼到底對其如何解決呢?以下的文章就有解答。

對PHP和MySQL 的研究並不深入,以下是我的一些個人心得,說的可能不是很明白,但確實是很管用的東西。

我的Discuz版本是UTF-8的,但是打開phpmyadmin顯示的是 整理欄目:gbk_chinese_ci ,而且查看數據顯示完全正常,沒有亂碼,這個表示,實際 discuz在存取數據庫用的是 gbk編碼,但頁面顯示確實UTF-8編碼阿,怎麼沒有MySQL 數據亂碼呢?難道Discuz做了編碼轉換。

最近在公司開發一個網站,由於用到了 cakephp框架 ,默認編碼為UTF-8,而且我的計算機是Ubuntu,通常用的都是UTF-8編碼,所寫的程序頁面也都是UTF-8編碼的文件,自然想到用UTF-8編碼的數據庫,這個問題可把我苦大了。

按照一般網上的說法是建立數據庫表的時候加上 DEFAULT CHARSET UTF8 ,創建的表的整理欄目在phpmyadmin裡面顯示的 是 utf8_general_ci ,在執行sql 語句是加上“set names utf8”,這樣就會正常了,插入的數據在頁面裡面顯示完全正常,我的頁面是 設置了UTF-8編碼的 ,<meta http-equiv="content-type" content="text/html; charset=UTF-8" /> 。

按理說應該沒有什麼問題的,但是在Phpmyadmin裡面顯示的確是MySQL 數據亂碼,而且如果我在phpmyadmin裡面修改了一個數據,在phpmyadmin裡面顯示就是正常了,但是到頁面顯示卻亂碼了,於是我想參考一下discuz的做法在phpmyadmin裡面強行把表和所有的char,varchar 和 text 字段改為gbk_chinese_ci ,修改後,phpmyadmin 裡面正常了,但是到頁面顯示確是MySQL 數據亂碼了,公司原來的數據庫是 ms-sql server 2000 的現在要導入到 MySQL5,原來的 兩個漢字在導入到 char(10)的時候 竟然報錯說是字符太長了,怎麼可能呢?

一個字符按照UTF16也就4個字節 最多才到8個字節阿怎麼回事阿?網上有人說是由於編碼不當可能會把UTF8的編碼經過兩次轉換 變成一個漢字6個字節存儲,具體是怎麼回事我也不清楚,不過後來經過多次實驗終於明白了原來MySQL存取編碼和查詢編碼並不一致,需要手動指定,也可以在 MySQL 的配置文件裡指定編碼網上有人的解決辦法是:

PHP源文件使用的是UTF-8編碼 MySQL 存儲用的是GBK編碼

  1. set character_set_client = utf8;  

指明也即php程序發往數據庫的SQL語句使用的是UTF8編碼,如insert;

  1. set character_set_connection = GBK;  

指明數據庫收到SQL語句之後應當將其從character_set_client轉碼為

utf8格式進行操作,如insert。若沒有這一句,插入的數據將變成問號)

  1. set character_set_results = utf8;  

指明數據庫查詢完畢之後應當以何種編碼返回給調用端,如select。

現在終極解決辦法,php 文件為UTF-8時的做法:在所有執行MySQL_query函數做數據庫插入刪除查詢之前 執行下面三個命令:

  1. MySQL_query('set character_set_client = utf8');  
  2. MySQL_query('set character_set_connection = GBK');  
  3. MySQL_query('set character_set_results = utf8');  

而不是以前的 set names utf8命令創建數據庫和創建表之時指定編碼為gbk ,指定 整理為:

  1. gbk_chinese_ci;  
  2. CREATE DATABASE `test` DEFAULT CHARACTER SET gbk COLLATE gbk_chinese_ci;  

這樣你的網站永遠 都不會有MySQL 數據亂碼問題了而且如果有一個字段是 username char(20),這樣就可以插入20個漢字,而不是20/2或者 20/3之類如果插入的是20個漢字, select length(username)查看 會返回 40 ,也就是說,MySQL 實際是用40個字符存儲的但是我們不用去管他實際的存儲,你想要限制多少就直接是指定char()多少就可以了,漢字和英文同樣對待。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved