折騰了很久,看了很多解決方案,要麼就是pma能顯示中文,控制台亂碼,要麼就PHP調用顯示出來是亂碼,很蛋疼,覺得必須要寫個文章總結一下。
1. 理解MySQL的編碼機制
MySQL處理連接時,外部連接發送過來的SQL請求會根據以下順序進行轉換:
character_set_client //客戶連接所采用的字符集
|
character_set_connection //MySQL連接字符集
|
character_set_database //數據庫所采用的字符集(表,列)
|
character_set_results //客戶機顯示所采用的字符集
詳見:mysql編碼詳解
除此之外,還有數據庫字符集、表字符集、字段字符集。
2.產生亂碼的根本原因在於
① 客戶機沒有正確地設置client字符集,導致原先的SQL語句被轉換成connection所指字符集,而這種轉換,是會丟失信息的,如果client是utf8格式,那麼如果轉換成gb2312格式,這其中必定會丟失信息,反之則不會丟失。一定要保證connection的字符集大於client字符集才能保證轉換不丟失信息。
② 數據庫字體沒有設置正確,如果數據庫字體設置不正確,那麼connection字符集轉換成database字符集照樣丟失編碼,原因跟上面一樣。
3. 解決控制台-pma亂碼
我這裡提供的方法是,將所有字符集統一為utf8
①統一 client、connection、database的字符集。
set character_set_client = gbk; set character_set_connection = utf8; set character_set_database = utf8; set character_set_results = gbk;
這裡說明一下,client=gbk是為了可以在控制台中輸入中文,results=gbk是為了可以在控制台中顯示中文。
修改完之後查看一下
show variables like "char%";+--------------------------+------------------------------------+
+--------------------------+------------------------------------+
②統一 數據庫、數據表、表字段的字符集。
第一步:查看特定數據庫字符集
查看數據庫db_test的字符集
show create database db_test;+----------+------------------------------------------------------------------+
如圖,可以看出來是 db_test數據庫的字符集已經是utf8了
第二步:查看指定數據表字符集
查看數據表person的字符集
show create table person;CREATE TABLE `person` (
如圖,可以看出來我的數據表也是utf8的字符集
第三步:查看指定表字段的字符集
show full columns from person;+-------+-------------+-----------------+------+-----+---------+-------+---------------------------------+---------+
這個是排序字符集utf8_general_ci,但是如果沒有人為改動的話,可以認為字段字符集為utf8,要是不確定的話,就直接修改。
第四步:修改字符集為utf8
修改數據庫字符集
alter database db_test charset utf8;修改表字符集
alter table person charset utf8;
修改字段字符集
alter table `person` modify column `name` varchar(30) character set utf8 not null;(我這裡同時設置了字段name不能為空,並且為varchar(30)類型)
更多修改方法請參考百度!!
以上為臨時設置。重啟mysql後又會恢復到原狀,所以在mysql目錄下的my.ini配置文件中的[mysqld]節點下加一句:
character_set_server=utf8
4. 解決PHP獲取數據的亂碼情況
在連接字符串中加一句:charset=utf8,即可。
5. 測試
在pma中添加一個中文,然後在控制台和pma和php中查看,
在php中執行一個插入中文語句,然後在控制台-pma-php中查看
在cmd中插入一個中文,然後在其他地方查看。
效果如如下:
cmd中:
pma中:
php中(網頁編碼格式為UTF-8):