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面向对象全攻略 (八)重载新的方法
Sep 30 PHP
PHP错误抑制符(@)导致引用传参失败Bug的分析
May 02 PHP
奇怪的PHP引用效率问题分析
Mar 23 PHP
php中导出数据到excel时数字变为科学计数的解决方法
Feb 03 PHP
深入eAccelerator与memcached的区别详解
Jun 06 PHP
使用PHP接收POST数据,解析json数据
Jun 28 PHP
一个漂亮的php验证码类(分享)
Aug 06 PHP
Codeigniter实现处理用户登录验证后的URL跳转
Jun 12 PHP
将CMYK颜色值和RGB颜色相互转换的PHP代码
Jul 28 PHP
php自动获取关键字的方法
Jan 06 PHP
Android AsyncTack 异步任务实例详解
Nov 02 PHP
php与c 实现按行读取文件实例代码
Jan 03 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源码加密 仿微盾PHP加密专家(PHPCodeLock)
2010/05/06 PHP
PHP和JAVA中的重载(overload)和覆盖(override) 介绍
2012/03/01 PHP
smarty模板引擎之配置文件数据和保留数据
2015/03/30 PHP
ThinkPHP中create()方法自动验证实例
2017/04/26 PHP
thinkPHP5框架闭包函数与子查询传参用法示例
2018/08/02 PHP
js 函数的副作用分析
2011/08/23 Javascript
模拟jQuery中的ready方法及实现按需加载css,js实例代码
2013/09/27 Javascript
简单实用的全选反选按钮例子
2013/10/18 Javascript
js/jquery去掉空格,回车,换行示例代码
2013/11/05 Javascript
jQuery避免$符和其他JS库冲突的方法对比
2014/02/20 Javascript
jQuery中:hidden选择器用法实例
2014/12/30 Javascript
JQuery CheckBox(复选框)操作方法汇总
2015/04/15 Javascript
jQuery实现两列等高并自适应高度
2016/12/22 Javascript
jquery设置css样式的多种方法(总结)
2017/02/21 Javascript
jQuery Pagination分页插件使用方法详解
2017/02/28 Javascript
微信小程序实现拖拽 image 触摸事件监听的实例
2017/08/17 Javascript
javascript+css3开发打气球小游戏完整代码
2017/11/28 Javascript
JS实现的缓冲运动效果示例
2018/04/30 Javascript
通过js实现压缩图片上传功能
2020/02/25 Javascript
[41:08]TNC vs VG 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
[46:38]完美世界DOTA2联赛PWL S2 Magma vs PXG 第三场 11.28
2020/12/02 DOTA
Python网站验证码识别
2016/01/25 Python
python3使用smtplib实现发送邮件功能
2018/05/22 Python
python实现银行实战系统
2020/02/26 Python
ansible-playbook实现自动部署KVM及安装python3的详细教程
2020/05/11 Python
python如何设置静态变量
2020/09/07 Python
使用CSS变量实现炫酷惊人的悬浮效果
2019/04/26 HTML / CSS
外包公司软件测试工程师
2014/11/01 面试题
公司总经理工作职责管理办法
2014/02/28 职场文书
青年文明号创建承诺
2014/03/31 职场文书
关于孝道的演讲稿
2014/05/21 职场文书
化工专业求职信
2014/07/01 职场文书
竞选班长演讲稿400字
2014/08/22 职场文书
查摆问题整改措施范文
2014/10/11 职场文书
解析Java异步之call future
2021/06/14 Java/Android
适合后台管理系统开发的12个前端框架(小结)
2021/06/29 Javascript