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 相关文章推荐
[FAQ]PHP中的一些常识:类篇
Oct 09 PHP
坏狼的PHP学习教程之第1天
Jun 15 PHP
php cookie 登录验证示例代码
Mar 16 PHP
php 字符过滤类,用于过滤各类用户输入的数据
May 27 PHP
PHP开启gzip页面压缩实例代码
Mar 11 PHP
查找mysql字段中固定字符串并替换的几个方法
Sep 23 PHP
php魔术方法与魔术变量、内置方法与内置变量的深入分析
Jun 03 PHP
使用php统计字符串中中英文字符的个数
Jun 23 PHP
destoon利用Rewrite规则设置网站安全
Jun 21 PHP
浅谈php+phpStorm+xdebug配置方法
Sep 17 PHP
给大家分享几个常用的PHP函数
Jan 15 PHP
laravel实现于语言包的完美切换方法
Sep 29 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
在VS2008中编译MYSQL5.1.48的方法
2010/07/03 PHP
php动态生成函数示例
2014/03/21 PHP
php+xml实现在线英文词典之添加词条的方法
2015/01/23 PHP
PHP导出Excel实例讲解
2016/01/24 PHP
简介PHP的Yii框架中缓存的一些高级用法
2016/03/29 PHP
PHP大文件切割上传功能实例分析
2019/07/01 PHP
php5对象复制、clone、浅复制与深复制实例详解
2019/08/14 PHP
可输入的下拉框
2006/06/19 Javascript
用jQuery实现检测浏览器及版本的脚本代码
2008/01/22 Javascript
js 实现css风格选择器(压缩后2KB)
2012/01/12 Javascript
jquery 关于event.target使用的几点说明介绍
2013/04/26 Javascript
JavaScript获取图片的原始尺寸以宽度为例
2014/05/04 Javascript
一个JS函数搞定网页标题(title)闪动效果
2014/05/13 Javascript
Javascript中的delete操作符详细介绍
2014/06/06 Javascript
jQuery实现本地预览上传图片功能
2016/01/08 Javascript
nodeJs爬虫获取数据简单实现代码
2016/03/29 NodeJs
jQuery如何获取动态添加的元素
2016/06/24 Javascript
JS实现touch 点击滑动轮播实例代码
2017/01/19 Javascript
nodejs基于mssql模块连接sqlserver数据库的简单封装操作示例
2018/01/05 NodeJs
[32:47]完美世界DOTA2联赛 GXR vs IO 第二场 11.07
2020/11/09 DOTA
用matplotlib画等高线图详解
2017/12/14 Python
Python生成器以及应用实例解析
2018/02/08 Python
Python使用进程Process模块管理资源
2020/03/05 Python
Python多进程编程常用方法解析
2020/03/26 Python
在jupyter notebook中调用.ipynb文件方式
2020/04/14 Python
Python getattr()函数使用方法代码实例
2020/08/10 Python
13个Pandas实用技巧,助你提高开发效率
2020/08/19 Python
丽笙酒店官方网站:Radisson Hotels
2019/05/07 全球购物
买卖正宗运动鞋:GOAT
2019/12/06 全球购物
Linux面试经常问的文件系统操作命令
2016/10/04 面试题
初中班主任评语大全
2014/04/24 职场文书
党的群众路线教育实践活动个人批评与自我批评
2014/10/16 职场文书
python 命令行传参方法总结
2021/05/25 Python
mysql定时自动备份数据库的方法步骤
2021/07/07 MySQL
JavaScript实例 ODO List分析
2022/01/22 Javascript