php讀mysql時,有以下幾個地方涉及到了字符集。
1. 建立資料庫表時指定資料庫表的字符集。例如
create table tablename
( id int not null auto_increment,
title varchar(20) not null,
primary key ('id')
)default charset =utf8;
如果在建立表時沒有指定表的字符集,則使用表所屬的資料庫的預設字符集。該字符集由character_set_database指定。
檢視資料庫表所使用的字符集的方法是:
show create table mytable;
(ps:建立資料庫/表和進行資料庫操作時盡量顯式指出使用的字符集,而不是依賴於mysql的預設設定,否則mysql公升級時可能帶來很大困擾[1])
2. mysql的字符集
mysql中有三個重要的變數,character_set_client,character_set_results,character_set_connection。
通過設定character_set_client,告訴mysql,php存進資料庫的是什麼編碼方式。
通過設定character_set_results,告訴mysql,php需要取什麼樣編碼的資料。
通過設定character_set_connection,告訴mysql,php查詢中的文字,使用什麼編碼。
3. 連線資料庫後,設定資料庫間傳輸字元時所用的預設字元編碼。
使用mysqli::set_charset()或mysqli::query('set names utf8'),進行設定。
盡量使用mysqli::set_charset(mysqli:set_charset)而不是」set names」(參考
這篇文章)
$db = new mysqli('localhost','user','passwd','database_name');
$db->set_charset('utf8');
注意是utf8,不是utf-8
(這裡有個問題就是,資料庫和php都已經統一了編碼,但是如果沒有呼叫mysqli::set_charset()函式時,讀出資料時仍然會出現亂碼。這是為什麼?)
(另,set names utf8相當於下面三句
set character_set_client = utf8;
set character_set_results = utf8;
set character_set_connection = utf8;
)4. html頁面使用的字符集。在meta標籤中設定
5. php文字檔案所使用的字符集。
在linux下可以用vim開啟檔案,輸入
:set encoding
檢視檔案使用的字符集
要保證不亂碼,需要保證檔案自身的編碼,html裡指定的編碼,php告訴mysql的編碼(包括character_set_client和character_set_results)統一。同時使用mysqli:set_charset()函式或」set names」。
針對「3」後面的問題,寫了幾個例子,測試鏈結資料庫後,設定和不設定字符集時的結果。測試環境ubuntu 12.04,mysql 5.5,php 5.5.7。
結果如下:
(1) 資料庫表字符集是utf8,不使用set names utf8
能正常插入、讀出中文,但是在mysql中顯示亂碼
(2) 資料庫表字符集是utf8,使用set names utf8
能正常插入、讀出中文,mysql中顯示正確
(3) 資料庫表字符集不是utf8,使用set names utf8
mysql中顯示,讀出都是問號。
參考:
[1]深入mysql字符集設定.
[2]php和mysql的編碼問題.
[3]深入理解set names和mysql(i)_set_charset的區別.
[4]mysql的「set names ***」字符集問題分析.
PHP讀MYSQL中文亂碼的解決方法
打算切換某個 的主機,沒想到遇到php和mysql中文亂碼的問題。以前的國外主機用的mysql是4.x系列的,感覺還比較好,都無論gbk和utf 8都沒有亂碼,沒想到新的主機的mysql是5.0版本的,匯入資料後,用php讀出來全是問號,亂碼一片,記得我以前也曾經有過一次切換出現亂碼的經驗,原因肯定...
PHP讀MYSQL中文亂碼的解決方法
打算切換某個 的主機,沒想到遇到php和mysql中文亂碼的問題。以前的國外主機用的mysql是4.x系列的,感覺還比較好,都無論gbk和utf 8都沒有亂碼,沒想到新的主機的mysql是5.0版本的,匯入資料後,用php讀出來全是問號,亂碼一片,記得我以前也曾經有過一次切換出現亂碼的經驗,原因肯定...
關於MySQL中文亂碼的問題
剛開始接觸mysql的時候,碰到中文亂碼的問題,真的時乙個頭兩個大,在網上找了好久的資料,終於找到了解決方法,怕以後忘記,便記錄下來,也希望看到了能夠有所幫助!中文亂碼一般是字元編碼問題 1.首先檢視資料庫預設的字元編碼,輸入下面命令 show variables like char 資料庫顯示如下...