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类
Oct 09 PHP
使用PHP提取视频网站页面中的FLASH地址的代码
Apr 17 PHP
解析php获取字符串的编码格式的方法(函数)
Jun 21 PHP
PHP中__FILE__、dirname与basename用法实例分析
Dec 01 PHP
php生成圆角图片的方法
Apr 07 PHP
Linux操作系统安装LAMP环境
Jun 26 PHP
php 利用socket发送HTTP请求(GET,POST)
Aug 24 PHP
浅析PHP关键词替换的类(避免重复替换,保留与还原原始链接)
Sep 22 PHP
php正则表达式验证(邮件地址、Url地址、电话号码、邮政编码)
Mar 14 PHP
详解PHP的Yii框架中组件行为的属性注入和方法注入
Mar 18 PHP
PHP单元测试框架PHPUnit用法详解
Jan 23 PHP
PHP文件类型检查及fileinfo模块安装使用详解
May 09 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
计算2000年01月01日起到指定日的天数
2006/10/09 PHP
php实现过滤字符串中的中文和数字实例
2015/07/29 PHP
CentOS下与Apache连接的PHP多版本共存方案实现详解
2015/12/19 PHP
删除重复数据的算法
2006/11/23 Javascript
jQuery控制图片的hover效果(smartRollover.js)
2012/03/18 Javascript
纯css+js写的一个简单的tab标签页带样式
2014/01/28 Javascript
jQuery-1.9.1源码分析系列(十一)DOM操作续之克隆节点
2015/12/01 Javascript
json格式数据的添加,删除及排序方法
2016/01/21 Javascript
基于BootStrap栅格栏系统完成网站底部版权信息区
2016/12/23 Javascript
前端跨域的几种解决方式总结(推荐)
2017/08/16 Javascript
11行JS代码制作二维码生成功能
2018/03/09 Javascript
JS中this的指向以及call、apply的作用
2018/05/06 Javascript
JavaScript设计模式之构造函数模式实例教程
2018/07/02 Javascript
js中Object.defineProperty()方法的不详解
2018/07/09 Javascript
vue递归组件实战之简单树形控件实例代码
2019/08/27 Javascript
Element-ui el-tree新增和删除节点后如何刷新tree的实例
2020/08/31 Javascript
vue el-upload上传文件的示例代码
2020/12/21 Vue.js
[01:03:31]DOTA2上海特级锦标赛B组资格赛#1 Alliance VS Fnatic第二局
2016/02/26 DOTA
利用python爬取斗鱼app中照片方法实例
2017/12/03 Python
python 与服务器的共享文件夹交互方法
2018/12/27 Python
python 自定义对象的打印方法
2019/01/12 Python
python Selenium实现付费音乐批量下载的实现方法
2019/01/24 Python
python找出一个列表中相同元素的多个索引实例
2019/06/11 Python
Python人工智能之路 之PyAudio 实现录音 自动化交互实现问答
2019/08/13 Python
如何获取Python简单for循环索引
2019/11/21 Python
Python文件时间操作步骤代码详解
2020/04/13 Python
django queryset相加和筛选教程
2020/05/18 Python
Selenium环境变量配置(火狐浏览器)及验证实现
2020/12/07 Python
python解包概念及实例
2021/02/17 Python
什么是CSS3 HSLA色彩模式?HSLA模拟渐变色条
2016/04/26 HTML / CSS
详解CSS3的perspective属性设置3D变换距离的方法
2016/05/23 HTML / CSS
兼职学生的自我评价
2013/11/24 职场文书
高中课程设置方案
2014/05/28 职场文书
班级元旦晚会开幕词
2015/01/29 职场文书
Python机器学习之基于Pytorch实现猫狗分类
2021/06/08 Python
bose降噪耳机音能消除人声吗
2022/04/19 数码科技