码迷,mamicode.com
首页 > 数据库 > 详细

【MySQL】统一控制台-pma-PHP编码!解决中文乱码问题

时间:2016-03-28 00:11:54      阅读:244      评论:0      收藏:0      [点我收藏+]

标签:

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

技术分享

技术分享




【MySQL】统一控制台-pma-PHP编码!解决中文乱码问题

标签:

原文地址:http://blog.csdn.net/tinyjian/article/details/50991020

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!