PHP存取MySQL 数据乱码的破解

数据库 MySQL
此文章主要向大家描述的是PHP存取MySQL 数据乱码的实际解决方法,以及在实际操作中有哪些的具体事项是值得我们大家注意的。

以下的文章主要向大家介绍的是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编码

  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远程访问不允许得个好用方案
责任编辑:佚名 来源: cnblogs
相关推荐

2010-06-09 16:46:37

MySQL 乱码处理

2010-06-02 10:19:49

2010-05-31 16:57:09

2009-02-25 15:39:15

乱码原理MySQL

2009-11-30 11:10:12

PHP显示MySQL乱

2010-06-04 15:57:03

PHP+MYSQL

2009-12-10 10:49:21

PHP eval加密

2011-05-23 09:51:30

MySQL

2010-06-04 19:24:15

重装MySQL数据库

2010-10-08 11:41:38

PHP连接MYSQL

2010-05-31 18:33:00

MySQL中文乱码

2009-12-24 16:20:19

Linux破解PHP

2010-06-07 09:22:21

2010-05-27 18:44:14

MySQL远程连接

2011-05-16 10:31:19

mysql乱码

2009-11-30 11:01:20

MySQL与PHP产生

2010-06-10 15:44:53

2009-05-07 11:30:28

Oracle扫描数据索引

2010-06-07 13:00:34

MySQL数据库

2009-12-09 13:54:42

PHP Zend加密文
点赞
收藏

51CTO技术栈公众号