PHP编码问题总结

今天刚学完php的mysqli扩展,动手写了一个mysqliHelper类。期间遇到了中文乱码问题,在mysql控制台输入命令:set names gbk后仍然乱码。我以为是mysql数据库编码格式问题,百度了各种博客、论坛、文库相关文章,把 character_set_xxx按文章里正确的编码格式全设置了一遍,乱码问题依然活蹦乱跳。无奈之下离开屏幕放松下大脑才后知后觉我没有发现问题的本质。

mysql中文乱码问题有两种原因:

1、数据库中数据本身不乱码,mysql控制台显示数据的编码格式与数据的编码格式不一致。

2、php代码传入mysal数据库的数据编码格式与mysql数据库编码格式不一致,导致数据本身乱码。

对于第一种原因,执行语句set names xxx可轻松解决,对于第二种原因则麻烦一些,只有让php的三种编码统一了才能解决。

我遇到的mysql中文乱码原因属于第二种 。站在前辈们的肩膀上(阅读他们文章),经过几小时的动手实验终于解决问题,在这里赶紧把一些知识记下,加深理解之余希望能够帮助到同病人。

一、php编码

php中共有4块编码:html页面编码,php源程序编码,html、php代码文件本身编码,数据库编码。这四块编码必须统一。

html页面编码告诉浏览器用什么编码格式显示这个html页面,这样设置<meta http-equiv="Content-Type" content="text/html; charset=xxx" />

php源程序编码告诉浏览器用什么格式显示这个php页面,这样设置 header("content-type:text/html; charset=xxx")(关于meta与header设置编码的区别参考博客里“php编码统一与php页面编码详解”一文)

html、php代码文件本身编码顾名思义是文件本身的编码格式,记事本保存时文件名下方可选文件编码格式

数据库编码包含多种字符集的编码格式。

这四块编码统一,乱码问题解决。除了数据库外其他编码设置容易,接下来说数据库编码。

二、数据库编码

执行sql语句show variables like 'character_set%' 可查看数据库里字符集(各种编码格式),如下图:

– character_set_server:默认的内部操作字符集
– character_set_client:客户端来源数据使用的字符集
– character_set_connection:连接层字符集
– character_set_results:查询结果字符集
– character_set_database:当前选中数据库的默认字符集
– character_set_system:系统元数据(字段名等)字符集

这里有两个重要的字符集:character_set_server和character_set_client。

character_set_server/character_set_database/character_set_table三个字符集优先级依次增加,在创建数据库或表时没有指定编码格式时,之后两个字符集编码格式自动与character_set_server一致。在mysql安装文件目录下bin文件夹中的my.ini里[mysqld]项下可设置character_set_server。执行创建数据库sql语句时可指定编码格式设置,如:create database test charset=utf8.

在没有指定character_set_result或character_set_connection字符集的编码格式时,它们自动与character_set_client字符集编码格式一致。用sql语句"set names xxx"可以设定character_set_client的编码格式。

在my.ini文件里[mysqld]项下定义character_set_server编码格式为utf8,character_set_client编码格式为gbk可以一劳永逸的解决因第二种原因产生的中文乱码问题,即使重启mysql数据库服务器也能识别中文。

但最好在创建数据库时指定编码格式,在php代码中连接数据库后执行“set names xxx”;

三、如何编码统一

1、html页面。

用<meta http-equiv="Content-Type" content="text/html; charset=xxx" />设定。

2、php源程序编码

用header("content-type:text/html; charset=xxx")设定。

3、html、php文件本身编码

用文本处理工具,如notepid、notepid++设定。

4、数据库编码

创建数据库时指定编码格式,如:create database test charset=xxx  。php代码中连接数据库代码后用各个扩展的query方法执行“set names xxx”sql语句。

这些xxx必须一致,xxx是utf-8,html、php文件本身编码设定成utf-8,xxx是gbk,文件本身编码设定成ansi。

注:php编写文件上传、下载功能时,xxx要与上传、下载的文件编码一致。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值