【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):






转载于:https://www.cnblogs.com/tinyjian/p/6550698.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值