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模板技术原理【一】
Jan 10 PHP
php程序之die调试法 快速解决错误
Sep 17 PHP
PHP中PDO的错误处理
Sep 04 PHP
PHP中shuffle数组值随便排序函数用法
Nov 21 PHP
PHP制作万年历
Jan 07 PHP
PHP中的traits简单使用实例
May 13 PHP
PHP实现获取文件后缀名的几种常用方法
Aug 08 PHP
centos+php+coreseek+sphinx+mysql之一coreseek安装篇
Oct 25 PHP
php中namespace及use用法分析
Dec 06 PHP
yii2.0整合阿里云oss删除单个文件的方法
Sep 19 PHP
PHP精确到毫秒秒杀倒计时实例详解
Mar 14 PHP
Yii框架getter与setter方法功能与用法分析
Oct 22 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 字符串加密函数(在指定时间内加密还原字符串,超时无法还原)
2010/04/28 PHP
浅析Apache中RewriteCond规则参数的详细介绍
2013/06/30 PHP
header导出Excel应用示例
2014/01/24 PHP
php页面函数设置超时限制的方法
2014/12/01 PHP
ThinkPHP中create()方法自动验证实例
2017/04/26 PHP
Laravel框架实现redis集群的方法分析
2017/09/14 PHP
PHP类的自动加载机制实现方法分析
2019/01/10 PHP
js 获取子节点函数 (兼容FF与IE)
2010/04/18 Javascript
JQuery Easyui Tree的oncheck事件实现代码
2010/05/28 Javascript
用原生JavaScript实现jQuery的$.getJSON的解决方法
2013/05/03 Javascript
document.getElementById获取控件对象为空的解决方法
2013/11/20 Javascript
jquery事件重复绑定的快速解决方法
2014/01/03 Javascript
jquery中获得元素尺寸和坐标的方法整理
2014/05/18 Javascript
jQuery实现鼠标经过弹出提示信息的地图热点效果
2015/08/07 Javascript
jQuery实现滑动页面固定顶部显示(可根据显示位置消失与替换)
2015/10/28 Javascript
js实现select二级联动下拉菜单
2020/04/17 Javascript
AngularJS入门教程之双向绑定详解
2016/08/18 Javascript
html5+CSS 实现禁止IOS长按复制粘贴功能
2016/12/28 Javascript
如何获取元素的最终background-color
2017/02/06 Javascript
记一次vue去除#问题处理经过小结
2019/01/24 Javascript
非常实用的jQuery代码段集锦【检测浏览器、滚动、复制、淡入淡出等】
2019/08/08 jQuery
Vue父组件监听子组件生命周期
2020/09/03 Javascript
Python中为什么要用self探讨
2015/04/14 Python
Python-嵌套列表list的全面解析
2016/06/08 Python
Python新手入门最容易犯的错误总结
2017/04/24 Python
flask框架视图函数用法示例
2018/07/19 Python
Python基于OpenCV库Adaboost实现人脸识别功能详解
2018/08/25 Python
python2.7使用plotly绘制本地散点图和折线图
2019/04/02 Python
详解python 模拟豆瓣登录(豆瓣6.0)
2019/04/18 Python
Python Pandas数据结构简单介绍
2019/07/03 Python
Pycharm创建项目时如何自动添加头部信息
2019/11/14 Python
使用pandas 将DataFrame转化成dict
2019/12/10 Python
详解python程序中的多任务
2020/09/16 Python
阿联酋航空假期:Emirates Holidays
2018/03/20 全球购物
兰蔻法国官方网站:Lancôme法国
2020/02/22 全球购物
高中语文教材(文学文化常识大全一)
2019/08/13 职场文书