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 file_get_contents 函数超时的几种解决方法
Jul 30 PHP
php学习笔记(三)操作符与控制结构
Aug 06 PHP
easyui的tabs update正确用法分享
Mar 21 PHP
PHPThumb图片处理实例
May 03 PHP
PHP实用函数分享之去除多余的0
Feb 06 PHP
php类自动加载器实现方法
Jul 28 PHP
PHP实现的限制IP投票程序IP来源分析
May 04 PHP
PHP上传图片、删除图片简单实例
Nov 12 PHP
PHP实现电商订单自动确认收货redis队列
May 17 PHP
Laravel中的Auth模块详解
Aug 17 PHP
thinkphp5 加载静态资源路径与常量的方法
Dec 24 PHP
PHP whois查询类定义与用法示例
Apr 03 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
数字转英文
2006/12/06 PHP
PHP版网站缓存加快打开速度的方法分享
2012/06/03 PHP
php+mysql+ajax实现单表多字段多关键词查询的方法
2017/04/15 PHP
php数值转换时间及时间转换数值用法示例
2017/05/18 PHP
PHP注释语法规范与命名规范详解篇
2018/01/21 PHP
?牟┛途W扣了一??效果出?? target=
2007/05/27 Javascript
JS 遮照层实现代码
2010/03/31 Javascript
JS getAttribute和setAttribute(取得和设置属性)的使用介绍
2013/07/10 Javascript
JQuery写动态树示例代码
2013/07/31 Javascript
简介JavaScript中Math.LOG10E属性的使用
2015/06/14 Javascript
jQuery实现的图片轮播效果完整示例
2016/09/12 Javascript
进阶之初探nodeJS
2017/01/24 NodeJs
socket.io学习教程之基础介绍(一)
2017/04/29 Javascript
基于angular2 的 http服务封装的实例代码
2017/06/29 Javascript
Vue中使用Sortable的示例代码
2018/04/07 Javascript
vue实现pdf导出解决生成canvas模糊等问题(推荐)
2018/10/18 Javascript
js通过循环多张图片实现动画效果
2019/12/19 Javascript
JS实现购物车基本功能
2020/11/08 Javascript
[06:45]DOTA2卡尔工作室 英雄介绍幻影长矛手篇
2013/07/12 DOTA
[01:06]DOTA2亚洲邀请赛专属珍藏-荧煌之礼
2017/03/24 DOTA
Python解析网页源代码中的115网盘链接实例
2014/09/30 Python
python使用邻接矩阵构造图代码示例
2017/11/10 Python
python3.6+selenium实现操作Frame中的页面元素
2019/07/16 Python
python opencv将图片转为灰度图的方法示例
2019/07/31 Python
用python读取xlsx文件
2020/12/17 Python
CSS3教程(9):设置RGB颜色
2009/04/02 HTML / CSS
瑞典灯具和照明网上商店:Lamp24.se
2018/03/17 全球购物
纽约手袋品牌:KARA
2018/03/18 全球购物
阿迪达斯希腊官方网上商店:adidas希腊
2019/04/06 全球购物
美国手机支架公司:PopSockets
2019/11/27 全球购物
新年抽奖获奖感言
2014/03/02 职场文书
钱塘江大潮导游词
2015/02/03 职场文书
2016高考感言
2015/08/01 职场文书
2019新学期家长会工作计划
2019/08/21 职场文书
go类型转换及与C的类型转换方式
2021/05/05 Golang
利用Pycharm连接服务器的全过程记录
2021/07/01 Python