php读取mysql乱码,用set names XXX解决的原理分享


Posted in PHP onDecember 29, 2011

先说MySQL的字符集问题。Windows下可通过修改my.ini内的

PHP代码

[mysql] default-character-set=utf8 //客户端的默认字符集 
[mysqld] 
default-character-set=utf8 //服务器端默认的字符集

假设我们把两个都设为utf8,然后在MySQL Command Line Client里面输入“show variebles like“character_set_%”;”,可看到如下字符:
character_set_client latin1 
character_set_connection latin1 
character_set_database utf8 
character_set_results latin1 
character_set_server utf8 
character_set_system utf8

要是我们通过采用UTF-8的PHP程序从数据库里读取数据,很有可能是一串“?????”或者是其他乱码。

解决办法是,在连接数据库之后,读取数据之前,先执行一项查询“SET NAMES UTF8”,即在PHP里为

mysql_query("SET NAMES UTF8");

//该句话一定要放在数据库服务器连接语句【$connection=mysql_connect($db_host,$db_user,$db_psw)or die("连接服务器失败");】之后

即可显示正常(只要数据库里信息的字符正常)。

到MySQL命令行输入“SET NAMES UTF8;”,然后执行“show variebles like“character_set_%”;”,发现原来为latin1的那些变量“character_set_client”、“character_set_connection”、“character_set_results”的值全部变为utf8了,原来是这3个变量在捣蛋。

查阅手册,上面那句等于:

SET character_set_client = utf8;

SET character_set_results = utf8;

SET character_set_connection = utf8;

看看这3个变量的作用:
信息输入路径:client→connection→server;
信息输出路径:server→connection→results。
换句话说,每个路径要经过3次改变字符集编码。以出现乱码的输出为例,server里utf8的数据,传入connection转为latin1,传入results转为latin1,utf-8页面又把results转过来。如果两种字符集不兼容,比如latin1和utf8,转化过程就为不可逆的,破坏性的。

但这里要声明一点,“SET NAMES UTF8”作用只是临时的,MySQL重启后就恢复默认了。

接下来就说到MySQL在服务器上的配置问题了。岂不是我们每次对数据库读写都得加上“SET NAMESUTF8”,以保证数据传输的编码一致?能不能通过配置MySQL来达到那三个变量默认就为我们要想的字符集?手册上没说,我在网上也没找到答案。所以,从服务器配置的角度而言,是没办法省略掉那行代码的。
总结:为了让你的网页能在更多的服务器上正常地显示,还是加上“SET NAMES UTF8”吧,即使你现在没有加上这句也能正常访问。

PHP 相关文章推荐
PHP跳转页面的几种实现方法详解
Jun 08 PHP
比较strtr, str_replace和preg_replace三个函数的效率
Jun 26 PHP
php中require和require_once的区别说明
Feb 27 PHP
PHP使用GETDATE获取当前日期时间作为一个关联数组的方法
Mar 19 PHP
PHP使用flock实现文件加锁的方法
Jul 01 PHP
PHP文件操作之获取目录下文件与计算相对路径的方法
Jan 08 PHP
PHP生成图片缩略图类示例
Jan 12 PHP
php 开发中加密的几种方法总结
Mar 22 PHP
thinkphp5.0整合phpsocketio完整攻略(绕坑)
Oct 12 PHP
PHP使用Session实现上传进度功能详解
Aug 06 PHP
php 多继承的几种常见实现方法示例
Nov 18 PHP
ThinkPHP5 框架引入 Go AOP,PHP AOP编程项目详解
May 12 PHP
php站内搜索并高亮显示关键字的实现代码
Dec 29 #PHP
PHP数组 为文章加关键字连接 文章内容自动加链接
Dec 29 #PHP
PHP防CC攻击实现代码
Dec 29 #PHP
php curl常见错误:SSL错误、bool(false)
Dec 28 #PHP
PHP+Ajax异步通讯实现用户名邮箱验证是否已注册( 2种方法实现)
Dec 28 #PHP
shopex主机报错误请求解决方案(No such file or directory)
Dec 27 #PHP
PHP写UltraEdit插件脚本实现方法
Dec 26 #PHP
You might like
php使用fgetcsv读取csv文件出现乱码的解决方法
2014/11/08 PHP
PHP实现断点续传乱序合并文件的方法
2018/09/06 PHP
jQuery学习5 jQuery事件模型
2010/02/07 Javascript
JQuery 常用操作代码
2010/03/14 Javascript
jquery 模拟雅虎首页的点击对话框效果
2010/04/11 Javascript
加载jQuery后$冲突的解决办法
2010/07/09 Javascript
jquery 学习之二 属性(html()与html(val))
2010/11/25 Javascript
jQuery中last()方法用法实例
2015/01/06 Javascript
jquery实现textarea 高度自适应
2015/03/11 Javascript
JS实现双击编辑可修改状态的方法
2015/08/14 Javascript
JavaScript电子时钟倒计时第二款
2016/01/10 Javascript
关于JSON.parse(),JSON.stringify(),jQuery.parseJSON()的用法
2016/06/30 Javascript
jQuery EasyUI编辑DataGrid用combobox实现多级联动
2016/08/29 Javascript
Query常用DIV操作获取和设置长度宽度的实现方法
2016/09/19 Javascript
windows下vue.js开发环境搭建教程
2017/03/20 Javascript
nodejs使用express创建一个简单web应用
2017/03/31 NodeJs
JS判断两个对象内容是否相等的方法示例
2017/04/10 Javascript
详解js类型判断
2018/05/22 Javascript
微信小程序下拉刷新PullDownRefresh的使用方法
2018/11/29 Javascript
基于Proxy的小程序状态管理实现
2019/06/14 Javascript
jquery.pager.js实现分页效果
2019/07/29 jQuery
Python中运行并行任务技巧
2015/02/26 Python
python 实现A*算法的示例代码
2018/08/13 Python
Python实现简易过滤删除数字的方法小结
2019/01/09 Python
对python 自定义协议的方法详解
2019/02/13 Python
python实现微信自动回复及批量添加好友功能
2019/07/03 Python
教你如何编写、保存与运行Python程序的方法
2019/07/12 Python
Python写出新冠状病毒确诊人数地图的方法
2020/02/12 Python
澳大利亚领先的在线美容商店:Facial Co
2017/10/22 全球购物
护士实习鉴定范文
2013/12/22 职场文书
通信工程专业毕业生推荐信
2013/12/25 职场文书
电气工程师岗位职责
2014/01/01 职场文书
人力资源管理专业自荐书范文
2014/02/10 职场文书
大学生学习2014年全国两会心得体会
2014/03/12 职场文书
8和9的加减法教学反思
2014/05/01 职场文书
采购员工作总结范文
2015/08/12 职场文书