PHP存取MySQL 数据乱码的破解

以下的文章主要向大家介绍的是PHP(PHP培训 php教程 )存取MySQL(MySQL认证 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()多少就可以了,汉字和英文同样对待。

时间: 2024-10-13 22:27:18

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

python字符集的转换(mysql数据乱码的处理)

本文参考:http://blog.csdn.net/crazyhacking/article/details/39375535   谢谢整理! chardet模块:http://blog.csdn.net/tianzhu123/article/details/8187470 字符集转换部分:http://blog.chinaunix.net/uid-26249349-id-2846894.html 1.mysql乱码问题: 背景:两个msyql库,字符集均为gbk,需要从A库中取数据,插入到B库

MyEclipse+Hibernate写入MySQL数据乱码问题

首先,要统一MyEclipse的字符编码,步骤如下: 1.进入Window--Preferences--General--Workspace,Text file encoding 选项中默认的Default(GBK)选项更改为Other,并将值设为utf-8: 2.进入Window--Preferences--MyEclipse--Files and Editors,将这个选项下面的:ASP and PHP.CSS.DTD.HTML.JSP.XML中的字符编码全部更改为utf-8: 3.如果有必

MySQL数据库:完美解决中文数据乱码

首先声明:这是解决我的问题的方法,个人笔记,仅供参考. 环境:win server 2003 + MySQL5.0 + Navicat 10 问题现象:通过Java WEB 页面提交数据到MySQL数据,发生中文乱码,每个汉字显示为?号,例如:"标题1"显示为"??1". 解决方法:找到MySQL5.0安装目录下编辑打开my.ini文件,修改为: [client] port=3306 [mysql] default-character-set=utf8 # The

解决mysql控制台查询数据乱码的问题,有图有真相

在mysql  控制台当 当为gbk的时候查询的数据是汉字,假设不是则为乱码.  set  names  gbk;  那么查询出来的数据则为汉字 解决mysql控制台查询数据乱码的问题,有图有真相,布布扣,bubuko.com

MySQL数据移植中的乱码问题

MySQL数据如果从低版本的mysql向更高的版本移植的时候,若移植的数据中含有中文的数据时,很容易出现乱码问题.很多是在从MySQL4.x向MySQL5.x移植的时候出现.例如,我找了一个用mysql.4建立的表,表结构如下: CREATE TABLE `tb_bookcase` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(30) DEFAULT NULL, `Column_3` char(10) DEFAUL

解决mysql导入导出数据乱码问题

最近在linux上面用mysqldump导出数据,放在windows系统中导入就会出现中文乱码,然后就会导致出现: Unknown MySQL server host和Can't connect to the server的错误.解决mysql导入导出数据乱码问题就是统一导入导出的编码,linux默认的是utf8编码,而windows是gbk编码,所以会出现上面的乱码问题. 解决mysql导入导出数据乱码问题 首先要做的是要确定你导出数据的编码格式,使用mysqldump的时候需要加上--def

Linux服务器使用命令操作MySQL插入数据乱码问题

服务器上使用MySQL命令方式进行插入数据时,很多时候会遇到插入数据乱码问题,导出一个sql执行文件,再倒入到unbutn中,结果出现乱码,折腾7-8分钟, 解决方式 在导出mysql sql执行文件的时候,指定一下编码格式: 复制代码代码如下: mysqldump -uroot -p --default-character-set=utf8 mo(dbname) > E://xxxx.sql 导入的时候OK了 执行如下 复制代码代码如下: mysql -u root -p --default-

笔记:PHP查询mysql数据后中文字符乱码

新建表Clubs CREATE TABLE `Clubs` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(30) CHARACTER SET utf8 NOT NULL DEFAULT '', PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; id name 1 程序员2 架构师3 产品经

mysql数据库数据乱码解决方案

一: 问题描述 浏览器发送请求,携带参数,需要修改数据库[mysql]数据,携带的参数在服务器控制台打印展示时未乱码,修改数据库后数据库显示乱码. 二: 解决方案 Ⅰ:[解决方法一] url设置编码: jdbc:mysql://localhost/openemm?useUnicode=yes&characterEncoding=UTF-8 Ⅱ:[解决方法二] 修改mysql配置.(其他需求可参考后自行脑补修改...) 步骤一:查找配置文件,查看数据库编码 步骤二:修改配置文件 步骤三:查看结果