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

时间: 2024-10-12 16:51:02

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

MySQL对JSON类型UTF-8编码导致中文乱码探讨

前言 继上文发表之后,结合评论意见并亲自验证最终发现是编码的问题,但是对于字符编码还是有点不解,于是乎,有了本文,我们来学习字符编码,在学习的过程中,我发现对于MySQL中JSON类型的编码导致数据中文出现乱码还有可深挖之处,接下来我们来分析一下,若有错误之处,还请批评指出. 字符编码 评论中指出任何不在基本多文本平面的Unicode字符,都无法使用MySQL的utf8字符集存储,包括Emoji 表情(Emoji 是一种特殊的Unicode 编码,常见于IOS和Android 手机上)和很多不常

mysql 实现批量导入,并解决中文乱码问题

public static String url = "jdbc:mysql://ip/database?characterEncoding=UTF-8"; //在database 后面加上?characterEncoding=UTF-8 就可以解决java 插入数据中文乱码问题 public static String username = "user"; public static String password = "123"; publi

Servlet中通过过滤器实现统一的手动编码(解决中文乱码)

<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.4" xmlns="http://<a href="http://lib.csdn.net/base/javaee" class='replace_word' title="Java EE知识库" target='_blank' style='color:#

Linux下MySQL 5.5的修改字符集编码为UTF8(彻底解决中文乱码问题)

一.登录MySQL查看用SHOW VARIABLES LIKE ‘character%’;下字符集,显示如下:+--------------------------+----------------------------+| Variable_name | Value |+--------------------------+----------------------------+| character_set_client | utf8 || character_set_connectio

【原创】通俗易懂地解决中文乱码问题(2) --- 分析解决Mysql插入移动端表情符报错 ‘incorrect string value: &#39;\xF0...

这篇blog重点在解决问题,如果你对字符编码并不是特别了解,建议先看看 < [原创]通俗易懂地解决中文乱码问题(1) --- 跨平台乱码 >. 当然,如果只是针对解决这个Mysql插入报错问题,本篇足够了. 一.定位错误 定位错误绝对是至关重要的一环.我建议遇到问题耐心分析一下比较好,毕竟“不是所有的牛奶都叫特仑苏”. 引起同一个问题的可能有很多,别人的解决方案也许并不适合自己. 那先看看问题出现在哪了,报错如下: 发现的确是编码错误, 16进制的错误提示(\xF0\x9F\x94\xA5\x

通俗易懂地解决中文乱码问题(2) --- 分析解决Mysql插入移动端表情符报错 ‘incorrect string value: &#39;\xF0...

原文:[原创]通俗易懂地解决中文乱码问题(2) --- 分析解决Mysql插入移动端表情符报错 'incorrect string value: '\xF0... 这篇blog重点在解决问题,如果你对字符编码并不是特别了解,建议先看看 < [原创]通俗易懂地解决中文乱码问题(1) --- 跨平台乱码 >. 当然,如果只是针对解决这个Mysql插入报错问题,本篇足够了. 一.定位错误 定位错误绝对是至关重要的一环.我建议遇到问题耐心分析一下比较好,毕竟“不是所有的牛奶都叫特仑苏”. 引起同一个问

MySQL 5.5版本解决中文乱码问题时my.ini内[mysqld]项中不能再写default-character-set=utf8

来看看如何解决乱码问题: 在mysql中默认字符集是latin1, 想要设置字符集为uft-8,可以在 my.cnf 文件中添加以下设置: [client] default-character-set=utf8 [mysqld] default-character-set=utf8 skip-character-set-client-handshake #此处是忽略客户端的字符集,使用服务器的设置 (skip语句和client中的default选一个) 当然你可以在建立数据库是规定字符集: 1

通俗易懂地解决中文乱码问题(1) --- 跨平台乱码

原文:[原创]通俗易懂地解决中文乱码问题(1) --- 跨平台乱码 本来是只打算写一篇关于中文乱码的blog的,但是发现要讲的东西跨度有点大,不好写到同一篇里面,所以分开了. 另一篇是  <[原创]通俗易懂地解决中文乱码问题(2) --- 分析解决Mysql插入移动端表情符报错 ‘incorrect string value: '\xF0...> . 这一篇重点在编码的理论,另一篇重点在解决问题及思路. 一.问题的开始 中文乱码问题经常出现在实际工程中,尤其容易发生在经验不足的团队对问题预估不

PHP解决中文乱码问题

1.PHP解决中文乱码问题 很多情况下,程序中出现中文输出时,页面会显示乱码 一般地原因有两种 编码(charset)设置错误,导致浏览器以错误的编码来解析,从而出现乱码 文件被以错误的编码方式打开并保存,比如GBK编码的文件,以UTF-8编码格式打开,再以UTF-8格式保存,就会出现乱码问题 将乱码情况分类并做出具有针对性的解决方案 1.1 解决HTML中页面中文乱码问题 如果你的HTML文本文件出现了筹码问题,那么你可以在head标签里面加入UTF-8编码(国际化编码):UTF-8是没有国家

Cocos2d-x 3.1.1 学习日志4--cocos2d-x解决中文乱码问题的几种办法

做个打飞机的游戏,由于版本太新,网上基本没有教教程,我的版本是cocos2d-x 3.1.1的,今天遇到cocos2dx中中文乱码的问题.无奈只好Google百度寻求答案,明白了这个问题的缘由.因为cocos2d-x内部是以utf8处理文本的,而VS直接输入时文本编码为GBK,如果添加L标志,则为Unicode编码. 解决这个问题有三种办法: 将源代码文件保存为utf8编码,不过由于编译器的问题,这种方式会导致很多无法预测的问题 将字符串用utf8编码集中存到一文件中,然后用代码读取这些字符串来