PHP+MYSQL中文乱码解决历程 | LSABLOG

首页 » Program » PHP&&Mysql » 正文

PHP+MYSQL中文乱码解决历程

问题描述:

1.php输出mysql里的中文数据出现乱码。

2.mysql存储中文数据乱码。

*******************************************

乱码问题一般就是编码不统一,只要把各部分的编码统一就ok了,但是就是各部分编码统一很烦人,写php时就遇到上述问题,记录一下解决过程,供大家参考。

这里以统一utf-8编码为例:
1.网页显示编码声明为utf-8:<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″ />

2.保存的文件用utf-8编码:另存为-utf-8-replace

3.thinkphp的配置 ‘db-charset’ => ‘utf8’

4,数据库编码改为utf8:mysql>alter database <数据库名> character set utf8;

5.数据库表名改为utf8:mysql>alter table <表名> character set utf8;

(最好在创建库和表就设为utf8,不然可能还要改字段的编码)
首先保证上述5点编码统一!

mysql> show variables like ‘character_set_database’;查看数据库编码
mysql> show create table <表名>;查看数据表编码
都是utf8没问题

但是看php输出的中文数据一直是乱码,看了网上的资料才发现cmd的编码是gbk,而我的中文数据是从cmd直接insert into的(在cmd中看正常不乱码),所以还是乱码,接着我从php添加中文数据,输出乱码问题解决!
由此引发新问题,当我在cmd中查看数据库中刚刚从php添加的中文数据又乱码了,而且一个中文就变成一个?号,其余正常。

先了解下相关知识:
show variables like ‘character%’;查看当前数据库的相关编码集
client    为客户端使用的字符集。
connection    为连接数据库的字符集设置类型,如果程序没有指明连接数据库使用的字符集类型则按照服务器端默认的字符集设置。
database    为数据库服务器中某个库使用的字符集设定,如果建库时没有指明,将使用服务器安装时指定的字符集设置。
results    为数据库给客户端返回时使用的字符集设定,如果没有指明,使用服务器默认的字符集。
server    为服务器安装时指定的默认字符集设定。
system    为数据库系统使用的字符集设定。

猜想可能是由于mysql用utf8存储数据,而cmd用gbk编码,所以在cmd中看就乱码了,尝试set names gbk;改变connection,results,client的编码为gbk,再次查看还是乱码(而且问号更多了……)。

现在先在my.cnf中加入:

[mysql]
default-character-set=utf8

[mysqld]
character-set-server=utf8

把connection,result,client都先设置为utf8。

发现中文乱码更奇怪了,但是用php新增的那个中文数据倒是没乱码了,以前用cmd新增的数据就是乱码(a…)。

感觉越来越乱了。

猜测可能是php用utf8新增数据而cmd新增的数据是gbk所以乱码,尝试用php再新增一条中文数据,结果发现php输出正常,在cmd中查看也正常,所以是cmd中用gbk insert into导致乱码,在cmd中再添加一条中文数据发现中文也正常了,真是神奇。

这个中文乱码问题真的非常烦人,不过勉强解决了文章开始的两个问题,先这样吧!

Comment