php讀mysql關於亂碼問題的總結

2021-06-20 06:36:12 字數 2096 閱讀 6620

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 資料庫顯示如下...