当前位置:首页 > 系统运维 > 正文内容

PHP存取MySQL 数据乱码的破解

a8116255316年前 (2010-06-02)系统运维12

以下的文章主要向大家介绍的是PHP存取MySQL 数据乱码的实际解决 *** 我们大家都知道MySQL 数据中出现乱码是一件令人十分头痛的的事情,那么到底对其如何解决呢?以下的文章就有解答。

对PHP和MySQL 的研究并不深入,以下是我的一些个人心得,说的可能不是很明白,但确实是很管用的东西。

我的Discuz版本是UTF-8的,但是打开phpmyadmin显示的是 整理栏目:gbk_chinese_ci ,而且查看数据显示完全正常,没有乱码,这个表示,实际 discuz在存取数据库用的是 gbk编码,但页面显示确实UTF-8编码阿,怎么没有MySQL 数据乱码呢?难道Discuz做了编码转换。

日前在公司开发一个网站,由于用到了 cakephp框架 ,默认编码为UTF-8,而且我的计算机是Ubuntu,通常用的都是UTF-8编码,所写的程序页面也都是UTF-8编码的文件,自然想到用UTF-8编码的数据库,这个问题可把我苦大了。

按照一般网上的说法是建立数据库表的时候加上 DEFAULT CHARSET UTF8 ,创建的表的整理栏目在phpmyadmin里面显示的 是 utf8_general_ci ,在执行sql 语句是加上“set names utf8”,这样就会正常了,插入的数据在页面里面显示完全正常,我的页面是 设置了UTF-8编码的 ,<meta http-equiv="content-type" content="text/html; charset=UTF-8" /> 。

按理说应该没有什么问题的,但是在Phpmyadmin里面显示的确是MySQL 数据乱码,而且如果我在phpmyadmin里面修改了一个数据,在phpmyadmin里面显示就是正常了,但是到页面显示却乱码了,于是我想参考一下discuz的做法在phpmyadmin里面强行把表和所有的char,varchar 和 text 字段改为gbk_chinese_ci ,修改后,phpmyadmin 里面正常了,但是到页面显示确是MySQL 数据乱码了,公司原来的数据库是 ms-sql server 2000 的现在要导入到 MySQL5,原来的 两个汉字在导入到 char(10)的时候 竟然报错说是字符太长了,怎么可能呢?

一个字符按照UTF16也就4个字节 最多才到8个字节阿怎么回事阿?网上有人说是由于编码不当可能会把UTF8的编码经过两次转换 变成一个汉字6个字节存储,具体是怎么回事我也不清楚,不过后来经过多次实验终于明白了原来MySQL存取编码和查询编码并不一致,需要手动指定,也可以在 MySQL 的配置文件里指定编码网上有人的解决办法是:

PHP源文件使用的是UTF-8编码 MySQL 存储用的是GBK编码

set character_set_client = utf8;  

指明也即php程序发往数据库的SQL语句使用的是UTF8编码,如insert;

set character_set_connection = GBK;  

指明数据库收到SQL语句之后应当将其从character_set_client转码为

utf8格式进行操作,如insert。(若没有这一句,插入的数据将变成问号)

set character_set_results = utf8;  

指明数据库查询完毕之后应当以何种编码返回给调用端,如select。

现在终极解决办法,php 文件为UTF-8时的做法:在所有执行MySQL_query函数做数据库插入删除查询之前 执行下面三个命令:

MySQL_query('set character_set_client = utf8');  MySQL_query('set character_set_connection = GBK');  MySQL_query('set character_set_results = utf8');  

而不是以前的 set names utf8命令创建数据库和创建表之时指定编码为gbk ,指定 整理为:

gbk_chinese_ci;  CREATE DATABASE `test` DEFAULT CHARACTER SET gbk COLLATE gbk_chinese_ci;  

这样你的网站永远 都不会有MySQL 数据乱码问题了而且如果有一个字段是 username char(20),这样就可以插入20个汉字,而不是20/2或者 20/3之类如果插入的是20个汉字, select length(username)查看 会返回 40 ,也就是说,MySQL 实际是用40个字符存储的但是我们不用去管他实际的存储,你想要限制多少就直接是指定char()多少就可以了,汉字和英文同样对待。

扫描二维码推送至手机访问。

版权声明:本文由2345好导航站长资讯发布,如需转载请注明出处。

本文链接:http://www.2345hao.cn/blog/index.php/post/20855.html

分享给朋友:

“PHP存取MySQL 数据乱码的破解” 的相关文章

windows 7/8.1正在启动windows时间长的解决方法

windows 7/8.1正在启动windows时间长的解决方法

正在启动windows时间长怎么办 小编带来了Windows 7/8.1正在启动windows时间长解决方法,假如有朋友在安装完Windows系统之后一直停留在“正在启动windows”的话,不妨试一试下文的方法哦~ 原因:Windows 7/8.1不完全支持UEFI,需要CSM(Comp...

windows 7系统开机提示press any key to restart的故障分析及解

windows 7系统开机提示press any key to restart的故障分析及解

Windows 7 64位系统开机后提示"press any key to restart",无法进入系统了,具体现象如下所示: 故障分析: 故障的主要原因还是硬盘的问题,可以先检查是不是接触不良或坏了,进行修复或更换即可。 解决方法: 1、开机按F8不动到高级选项出现在松手,选“...

如何删除自带的不常用应用为windows 7减负

如何删除自带的不常用应用为windows 7减负

对于Windows 7系统来说,其默认安装的许多工具是我们很少使用或从来不用的,比如系统自带的扫雷、纸牌游戏等。删除此类长期不用的系统组件,不但可以让系统更清爽,更重要的是还可以提高系统的运行速度,特别是对于硬件配置相对较低的上网本来说,尤其如此。接下来,笔者就给大家介绍一下如何删除Windows...

windows 7系统下Windows服务被流氓软件注册怎么办?Windows服务

windows 7系统下Windows服务被流氓软件注册怎么办?Windows服务

解决方法: 其实处理这些使用流氓软件,需要将相关的.exe文件删除,使它不能再运行,或者直接清除这个服务本身,使计算机重启的时候,它不会再启动。比如Hijackthis扫描,在扫描日志中,一般会把非Windows系统的服务以023的方式列出来,如下面这段: O23 - ...

windows 7系统开机提示Windows驱动器未就绪的故障原因及解决方法

windows 7系统开机提示Windows驱动器未就绪的故障原因及解决方法

 故障分析: 主要原因应该是不存在软盘驱动器或驱动器未安装,找到故障原因后,Windows 7 32位系统只要将软盘驱动器禁用就可以了。 解决措施: 1、右键点击计算机,选择管理,打开计算机管理窗口; 2、在计算机管理中,找到设备管理器,在右边的软盘控制器中右击,选择卸载即可。 以...

windows 7如何创建拨号连接

windows 7如何创建拨号连接

一、打开控制面板,选择“网络和共享中心”; 二、在网络和共享中心中选择“设置新的连接或网络”; 三、选择连接到Internet; 四、选择“仍要设置新的连接”; 五、选择“宽带PPPoE ”; 六、输入对应的宽带帐号及密码,点击连接即可;...