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中for循环语句的几种变型
Mar 16 PHP
php下目前为目最全的CURL中文说明
Aug 01 PHP
PHP取整数函数常用的四种方法小结
Jul 05 PHP
解析php中两种缩放图片的函数,为图片添加水印
Jun 14 PHP
浅析ThinkPHP的模板输出功能
Jul 01 PHP
自定义session存储机制避免会话保持问题
Oct 08 PHP
PHP Streams(流)详细介绍及使用
May 12 PHP
PHP7+Nginx的配置与安装教程详解
May 10 PHP
PHP strip_tags() 去字符串中的 HTML、XML 以及 PHP 标签的函数
May 22 PHP
PHP+iframe模拟Ajax上传文件功能示例
Jul 02 PHP
docker-compose部署php项目实例详解
Jul 30 PHP
PHP重载基础知识回顾
Sep 10 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设计模式 Decorator(装饰模式)
2011/06/26 PHP
分享php分页的功能模块
2015/06/16 PHP
编写PHP脚本来实现WordPress中评论分页的功能
2015/12/10 PHP
ThinkPHP5框架实现简单的批量查询功能示例
2018/06/07 PHP
PHP autoload使用方法及步骤详解
2020/09/05 PHP
PHP网站常见安全漏洞,及相应防范措施总结
2021/03/01 PHP
使用JavaScript修改浏览器URL地址栏的实现代码
2013/10/21 Javascript
js出生日期 年月日级联菜单示例代码
2014/01/10 Javascript
JS方法调用括号的问题探讨
2014/01/24 Javascript
javascript setinterval 的正确语法如何书写
2014/06/17 Javascript
js拼接html注意问题示例探讨
2014/07/14 Javascript
Javascript中封装window.open解决不兼容问题
2014/09/28 Javascript
使用canvas实现仿新浪微博头像截取上传功能
2015/09/02 Javascript
JQueryEasyUI之DataGrid数据显示
2016/11/23 Javascript
基于js实现的限制文本框只可以输入数字
2016/12/05 Javascript
layer弹出层中H5播放器全屏出错的解决方法
2017/02/21 Javascript
Angular实现预加载延迟模块的示例
2017/10/12 Javascript
详解vue 实例方法和数据
2017/10/23 Javascript
JavaScript中使用import 和require打包后实现原理分析
2018/03/07 Javascript
vuex直接赋值的三种方法总结
2018/09/16 Javascript
Python中for循环和while循环的基本使用方法
2015/08/21 Python
Python定时器实例代码
2017/11/01 Python
对python:循环定义多个变量的实例详解
2019/01/20 Python
python 发送json数据操作实例分析
2019/10/15 Python
用OpenCV进行年龄和性别检测的实现示例
2021/01/29 Python
英国奢华护肤、美容和Spa品牌:Temple Spa
2019/11/02 全球购物
澳大利亚电商Catch新西兰站:Catch.co.nz
2020/05/30 全球购物
人民调解员先进事迹材料
2014/05/08 职场文书
2014年城管个人工作总结
2014/12/08 职场文书
党校毕业个人总结
2015/02/28 职场文书
软件项目经理岗位职责
2015/04/01 职场文书
2015年乡镇安全生产工作总结
2015/05/19 职场文书
学术会议领导致辞
2015/07/29 职场文书
创业计划书之酒吧
2019/12/02 职场文书
js不常见操作运算符总结
2021/11/20 Javascript
python开发制作好看的时钟效果
2022/05/02 Python