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 相关文章推荐
为php4加入动态flash文件的生成的支持
Oct 09 PHP
PHP令牌 Token改进版
Jul 18 PHP
Cannot modify header information错误解决方法
Oct 08 PHP
php用数组返回无限分类的列表数据的代码
Aug 08 PHP
PHP代码网站如何防范SQL注入漏洞攻击建议分享
Mar 01 PHP
分享PHP header函数使用教程
Sep 05 PHP
codeigniter集成ucenter1.6双向通信的解决办法
Jun 12 PHP
php中ob_get_length缓冲与获取缓冲长度实例
Nov 20 PHP
PHP调试的强悍利器之PHPDBG
Feb 22 PHP
php编程中echo用逗号和用点号连接的区别
Mar 26 PHP
PHP实现一维数组与二维数组去重功能示例
May 24 PHP
PHP抽象类和接口用法实例详解
Jul 20 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数字字符串左侧补0、字符串填充和自动补齐的几种方法
2014/05/10 PHP
PHP线程的内存回收问题
2016/07/08 PHP
PHP基于DOMDocument解析和生成xml的方法分析
2017/07/17 PHP
简单实现php上传文件功能
2017/09/21 PHP
使用PHP+MySql+Ajax+jQuery实现省市区三级联动功能示例
2017/09/15 PHP
PHP中“=>
2019/03/01 PHP
JS解密入门 最终变量劫持
2008/06/25 Javascript
jquery 之 $().hover(func1, funct2)使用方法
2012/06/14 Javascript
javascript中使用new与不使用实例化对象的区别
2015/06/22 Javascript
javascript连续赋值问题
2015/07/08 Javascript
让你一句话理解闭包(简单易懂)
2016/06/03 Javascript
Mongoose经常返回e11000 error的原因分析
2017/03/29 Javascript
使用javaScript实现鼠标拖拽事件
2020/04/03 Javascript
浅谈angular4实际项目搭建总结
2017/12/01 Javascript
详解vue组件开发脚手架
2018/06/15 Javascript
vue--点击当前增加class,其他删除class的方法
2018/09/15 Javascript
JavaScript数组、json对象、eval()函数用法实例分析
2019/02/21 Javascript
es6中new.target的作用和使用场景简单示例分析
2020/03/14 Javascript
python绘制直线的方法
2018/06/30 Python
python使用writerows写csv文件产生多余空行的处理方法
2019/08/01 Python
Python实现报警信息实时发送至邮箱功能(实例代码)
2019/11/11 Python
Python进程池Pool应用实例分析
2019/11/27 Python
Python3+selenium实现cookie免密登录的示例代码
2020/03/18 Python
Windows下Pycharm远程连接虚拟机中Centos下的Python环境(图文教程详解)
2020/03/19 Python
Python requests HTTP验证登录实现流程
2020/11/05 Python
python绘制雷达图实例讲解
2021/01/03 Python
详解CSS3中的box-sizing(content-box与border-box)
2019/04/19 HTML / CSS
Canvas在超级玛丽游戏中的应用详解
2021/02/06 HTML / CSS
澳大利亚领先的时尚内衣零售商:Bras N Things
2020/07/28 全球购物
如何执行一个shell程序
2012/11/23 面试题
银行行长竞聘演讲稿
2014/04/23 职场文书
专科应届毕业生求职信
2014/06/04 职场文书
世界文化遗产导游词
2015/02/13 职场文书
小学生禁毒教育心得体会
2016/01/15 职场文书
MySql学习笔记之事务隔离级别详解
2021/05/12 MySQL
DQL数据查询语句使用示例
2022/12/24 MySQL