PHP存取MySQL数据乱码的破解

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

10年积累的网站设计、成都做网站经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先网站制作后付款的网站建设流程,更有巴彦免费网站建设让你可以放心的选择与我们合作。

对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编码的 ,

按理说应该没有什么问题的,但是在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编码

 
 
 
  1. set character_set_client = utf8;  

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

 
 
 
  1. set character_set_connection = GBK;  

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

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

 
 
 
  1. set character_set_results = utf8;  

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

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

 
 
 
  1. MySQL_query('set character_set_client = utf8');  
  2. MySQL_query('set character_set_connection = GBK');  
  3. MySQL_query('set character_set_results = utf8');  

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

 
 
 
  1. gbk_chinese_ci;  
  2. 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()多少就可以了,汉字和英文同样对待。

 【编辑推荐】

  1. MySQL编码机制与乱码
  2. PHP和MySQL存储过程的实例演示
  3. 解决MySQL无法远程访问的3方案
  4. 甲骨文对MySQL数据库做出十大承诺!
  5. 解决MySQL远程访问不允许得个好用方案

分享题目:PHP存取MySQL数据乱码的破解
转载来于:http://www.shufengxianlan.com/qtweb/news21/8821.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联