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 if 想到的些问题
Mar 22 PHP
PHP 图像尺寸调整代码
May 26 PHP
几款免费开源的不用数据库的php的cms
Dec 19 PHP
php中出现空白页的原因及解决方法汇总
Jul 08 PHP
Laravel框架学习笔记(一)环境搭建
Oct 15 PHP
php控制文件下载速度的方法
Mar 24 PHP
ThinkPHP、ZF2、Yaf、Laravel框架路由大比拼
Mar 25 PHP
php curl 上传文件代码实例
Apr 27 PHP
PHP对象实例化单例方法
Jan 19 PHP
老生常谈ThinkPHP中的行为扩展和插件(推荐)
May 05 PHP
使用一个for循环将N*N的二维数组的所有值置1实现方法
May 29 PHP
php实现数组中出现次数超过一半的数字的统计方法
Oct 14 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
PHP5在Apache下的两种模式的安装
2006/09/05 PHP
提升PHP执行速度全攻略(上)
2006/10/09 PHP
php+ajax+json 详解及实例代码
2016/12/12 PHP
php+mysql+ajax实现单表多字段多关键词查询的方法
2017/04/15 PHP
从面试题学习Javascript 面向对象(创建对象)
2012/03/30 Javascript
jQuery多条件筛选如何实现
2015/11/04 Javascript
js实现滚动条滚动到某个位置便自动定位某个tr
2021/01/20 Javascript
js表单登陆验证示例
2016/10/19 Javascript
Bootstrap CSS组件之面包屑导航(breadcrumb)
2016/12/17 Javascript
jQuery插件HighCharts实现2D柱状图、折线图的组合多轴图效果示例【附demo源码下载】
2017/03/09 Javascript
Node.js 使用命令行工具检查更新
2017/06/08 Javascript
node+vue实现用户注册和头像上传的实例代码
2017/07/20 Javascript
分析JavaScript数组操作难点
2017/12/18 Javascript
微信小程序通过保存图片分享到朋友圈功能
2018/05/24 Javascript
解决layer弹层遮罩挡住窗体的问题
2018/08/17 Javascript
js字符串处理之绝妙的代码
2019/04/05 Javascript
构建Vue大型应用的10个最佳实践(小结)
2019/11/07 Javascript
Vuex实现简单购物车
2021/01/10 Vue.js
Python3 安装PyQt5及exe打包图文教程
2019/01/08 Python
在Pandas中DataFrame数据合并,连接(concat,merge,join)的实例
2019/01/29 Python
详解PyCharm+QTDesigner+PyUIC使用教程
2019/06/13 Python
Pandas之排序函数sort_values()的实现
2019/07/09 Python
HTML5制作3D爱心动画教程 献给女友浪漫的礼物
2014/11/05 HTML / CSS
CK巴西官方网站:Calvin Klein巴西
2019/07/19 全球购物
Linux操作面试题
2015/02/11 面试题
实习单位接收函模板
2014/01/10 职场文书
单位消防安全制度
2014/01/12 职场文书
集体婚礼证婚词
2014/01/13 职场文书
中式餐厅创业计划书范文
2014/01/23 职场文书
书法比赛获奖感言
2014/02/10 职场文书
留学经费担保书
2014/05/12 职场文书
党员政治学习材料
2014/05/14 职场文书
店长岗位职责
2015/02/11 职场文书
公务员年度考核个人总结
2015/02/12 职场文书
终止解除劳动合同证明书
2015/06/17 职场文书
python index() 与 rindex() 方法的使用示例详解
2022/12/24 Python