PHP+MYSQL中文乱码问题


Posted in PHP onJuly 01, 2015

从MySQL 4.1开始引入多语言的支持,但是用PHP插入的中文会出现乱码.无论用什么编码也不行.

解决这个问题其实很简单.

1.在建表的时候设置编码类型为gb2312_chinese_ci.

2.在PHP页面的数据库连接语句加一行mysql_query("SET NAMES 'gb2312'",$link); 例如

$db_host="localhost"; 
$db_user="root"; 
$db_password="password"; 
$db_name="test";

$link=mysql_connect($db_host,$db_user,$db_password);
mysql_query("SET NAMES 'gb2312'",$link); 
$db=mysql_select_db($db_name,$link); 
$query="select * from user"; 
$result=mysql_query($query);

写入页面和读取页面都加入这行.这样在MYSQL里面的中文就能正常显示了.

相关资料:

从MySQL 4.1开始引入多语言的支持,而且一些特性已经超过了其他的数据库系统。
MySQL4.1的字符集支持(Character Set Support)有两个方面:字符集(Characterset)和排序方式(Collation)。对于字符集的支持细化到四个层次:服务器 (server),数据库(database),数据表(table)和连接(connection)。
查看系统的字符集和排序方式的设定可以通过下面的两条命令:!

mysql> show variables like 'character_set_%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
7 rows in set (0.00 sec)
mysql> show variables like 'collation_%';
+----------------------+-------------------+
| Variable_name | Value |
+----------------------+-------------------+
| collation_connection | latin1_swedish_ci |
| collation_database | latin1_swedish_ci |
| collation_server | latin1_swedish_ci |
+----------------------+-------------------+
3 rows in set (0.00 sec)

上面列出的值就是系统的默认值。(很奇怪系统怎么默认是latin1的瑞典语排序方式)...
当我们按照原来的方式通过PHP存取MySQL数据库时,就算设置了表的默认字符集为utf8并且通过UTF-8编码发送查询,你会发现存入数据库的仍然是乱码。问题就出在这个connection连接层上。解决方法是在发送查询前执行一下下面这句:
set names 'utf8';
它相当于下面的四句指令:

set character_set_client = utf8;

set character_set_results = utf8;

set character_set_connection = utf8;

set collation_connection = utf8_general_ci

由于默认网页提交的查询是gb2312(表单页面meta里可以看到),而mysql默认将其当作utf8(可以查到此时的 character_set_client=utf8),所以必然乱码。同理,mysql返回的结果是已经转换成 character_set_results编码的(与表的编码无关),同样默认是utf8,而网页页面把它当gb2312处理,所以必然有标题等由数据 库读出的字段是乱码而其他php部分文字不乱码的现象。

解决(by 一剑飘雪):
安装mysql5.0时要选utf8字符集(在用phpmyadmin创建数据库和字段时就不需要在整理中选utf8字符集了),并在php建立连接后发送

$link = mysql_connect('localhost', 'root', 'root');

mysql_query("SET NAMES 'utf8'",$link);

这时我们在网页中看到的还是乱码但已不是????了,查看网页源文件,已完全正常。用记事本打开php源文件,别存为utf8编码,再刷新网页,全部搞定了。
或者,当然还是要安装时仍要utf8安装,在php中发送set names 'gb2312',同时php文件存为记事本默认的ansi,也能正确显示中文.

但总不能每次连接时都发送一次SET NAMES 'utf8'吧,如何彻底解决还没找到方法。

这样安装mysql时缺省字符集选为utf8后又带来一个问题,我们在command.exe中进入mysql控制台后,查询结果又成了乱码,我们可以在查询前输入

mysql>set names 'gbk';

mysql>set names 'gb2312';

相当于告诉mysql客户端在使用gb2312字符集,结果就正确了,gb2312为GBK的子集.

PHP 相关文章推荐
用来给图片加水印的PHP类
Apr 09 PHP
php 无限分类的树类代码
Dec 03 PHP
基于MySQL分区性能的详细介绍
May 02 PHP
destoon官方标签大全
Jun 20 PHP
php页面函数设置超时限制的方法
Dec 01 PHP
PHP中使用file_get_contents抓取网页中文乱码问题解决方法
Dec 17 PHP
PHP代码实现表单数据验证类
Jul 28 PHP
thinkphp框架实现数据添加和显示功能
Jun 29 PHP
PHP 以POST方式提交XML、获取XML,解析XML详解及实例
Oct 26 PHP
Laravel5.0+框架邮件发送功能实现方法图文与实例详解
Apr 23 PHP
laravel 判断查询数据库返回值的例子
Oct 11 PHP
PHP $O00OO0=urldecode & eval 解密,记一次商业源码的去后门
Sep 13 PHP
PHP+shell实现多线程的方法
Jul 01 #PHP
WordPress中"无法将上传的文件移动至"错误的解决方法
Jul 01 #PHP
wamp服务器访问php非常缓慢的解决过程
Jul 01 #PHP
nginx+thinkphp下解决不支持pathinfo模式
Jul 01 #PHP
Smarty foreach控制循环次数的一些方法
Jul 01 #PHP
在Linux系统下一键重新安装WordPress的脚本示例
Jun 30 #PHP
Yii扩展组件编写方法实例分析
Jun 29 #PHP
You might like
php下MYSQL limit的优化
2008/01/10 PHP
PHP+MySQL投票系统的设计和实现分享
2012/09/23 PHP
php中引用符号(&)的使用详解
2013/11/13 PHP
php实现购物车功能(以大苹果购物网为例)
2017/03/09 PHP
Laravel模型事件的实现原理详解
2018/03/14 PHP
javascript 简单高效判断数据类型 系列函数 By shawl.qiu
2007/03/06 Javascript
JavaScript 仿关机效果的图片层
2008/12/26 Javascript
javascript实现table选中的行以指定颜色高亮显示的方法
2015/05/13 Javascript
jquery插件jquery.beforeafter.js实现左右拖拽分隔条对比图片的方法
2015/08/07 Javascript
jquery实现的简单二级菜单效果代码
2015/09/22 Javascript
JavaScript模拟push
2016/03/06 Javascript
Jquery跨域获得Json的简单实例
2016/05/18 Javascript
Javascript的动态增加类的实现方法
2016/10/20 Javascript
vue-router 学习快速入门
2017/03/01 Javascript
Angularjs使用过滤器完成排序功能
2017/09/20 Javascript
基于vue2.0实现简单轮播图
2017/11/27 Javascript
详解vue-router传参的两种方式
2018/09/10 Javascript
解决JS表单验证只有第一个IF起作用的问题
2018/12/04 Javascript
玩转Koa之核心原理分析
2018/12/29 Javascript
vue基础之v-bind属性、class和style用法分析
2019/03/11 Javascript
react native 仿微信聊天室实例代码
2019/09/17 Javascript
使用Bootstrap做一个朝代历史表
2019/12/10 Javascript
对pandas中apply函数的用法详解
2018/04/10 Python
pycharm设置注释颜色的方法
2018/05/23 Python
python 异或加密字符串的实例
2018/10/14 Python
python3.7 的新特性详解
2019/07/25 Python
Python3加密解密库Crypto的RSA加解密和签名/验签实现方法实例
2020/02/11 Python
深入浅析Python 函数注解与匿名函数
2020/02/24 Python
python批量检查两个对应的txt文件的行数是否一致的实例代码
2020/10/31 Python
中学生运动会新闻稿
2014/09/24 职场文书
幼儿园感恩节活动方案
2014/10/06 职场文书
国庆节标语大全
2014/10/08 职场文书
爱心募捐通知范文
2015/04/27 职场文书
堂吉诃德读书笔记
2015/06/30 职场文书
创业计划书之川味火锅店
2019/09/02 职场文书
python实现网络五子棋
2021/04/11 Python