【MySQL資料庫】統一控制臺-pma-PHP編碼!解決中文亂碼問題

折騰瞭很久,看瞭很多解決方案,要麼就是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%";

+————————–+————————————+
| Variable_name | Value |
+————————–+————————————+
| character_set_client | gbk |
| character_set_connection | gbk |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | gbk |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | d:\WebServer\MySQL\share\charsets\ |

+————————–+————————————+

②統一 資料庫、數據表、表字段的字符集。

第一步:查看特定資料庫字符集

查看資料庫db_test的字符集

show create database db_test;

+———-+——————————————————————+
| Database | Create Database |
+———-+——————————————————————+
| db_test | CREATE DATABASE `db_test` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+———-+——————————————————————+

如圖,可以看出來是 db_test資料庫的字符集已經是utf8瞭

第二步:查看指定數據表字符集

查看數據表person的字符集

show create table person;

CREATE TABLE `person` (
`name` varchar(30) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |

如圖,可以看出來我的數據表也是utf8的字符集

第三步:查看指定表字段的字符集

show full columns from person;

+——-+————-+—————–+——+—–+———+——-+———————————+———+
| Field | Type | Collation | Null | Key | Default | Extra | Privileges | Comment |
+——-+————-+—————–+——+—–+———+——-+———————————+———+
| name | varchar(30) | utf8_general_ci | NO | | NULL | | select,insert,update,references | |
+——-+————-+—————–+——+—–+———+——-+———————————+———+

這個是排序字符集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):

You May Also Like