折腾了很久,看了很多解决方案,要么就是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):