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集成FCK的函数代码
Sep 27 PHP
PHP 开源AJAX框架14种
Aug 24 PHP
php笔记之常用文件操作
Oct 12 PHP
PHP中获取内网用户MAC地址(WINDOWS/linux)的实现代码
Aug 11 PHP
PHP+iFrame实现页面无需刷新的异步文件上传
Sep 16 PHP
学习php设计模式 php实现适配器模式
Dec 07 PHP
WordPress中限制非管理员用户在文章后只能评论一次
Dec 31 PHP
ThinkPHP表单令牌错误的相关解决方法分析
May 20 PHP
php进程间通讯实例分析
Jul 11 PHP
PHP的RSA加密解密方法以及开发接口使用
Feb 11 PHP
Laravel框架实现model层的增删改查(CURD)操作示例
May 12 PHP
PHP如何使用cURL实现Get和Post请求
Jul 11 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读取富文本的时p标签会出现红线是怎么回事
2014/05/13 PHP
PHP实现多图片上传类实例
2014/07/26 PHP
使用YUI+Ant 实现JS CSS压缩
2014/09/02 PHP
php 解决substr()截取中文字符乱码问题
2016/07/18 PHP
php实现给二维数组中所有一维数组添加值的方法
2017/02/04 PHP
PHP whois查询类定义与用法示例
2019/04/03 PHP
Laravel 在views中加载公共页面的实现代码
2019/10/22 PHP
通过PHP实现用户注册后邮箱验证激活
2020/11/10 PHP
PHP 裁剪图片
2021/03/09 PHP
List Installed Software Features
2007/06/11 Javascript
解决Extjs上传图片无法预览的解决方法
2012/03/22 Javascript
jQuery fadeTo方法调整图片的透明度使用介绍
2013/05/06 Javascript
jquery append()方法与html()方法的区别及使用介绍
2014/08/01 Javascript
js实现文字闪烁特效的方法
2015/12/17 Javascript
BootStrap下jQuery自动完成的样式调整
2016/05/30 Javascript
Node.js 使用递归实现遍历文件夹中所有文件
2017/09/18 Javascript
vue项目打包后上传至GitHub并实现github-pages的预览
2019/05/06 Javascript
js和jquery判断数据类型的4种方法总结
2020/08/28 jQuery
python实现2014火车票查询代码分享
2014/01/10 Python
浅谈用Python实现一个大数据搜索引擎
2017/11/28 Python
Python3正则匹配re.split,re.finditer及re.findall函数用法详解
2018/06/11 Python
python使用opencv驱动摄像头的方法
2018/08/03 Python
Python使用monkey.patch_all()解决协程阻塞问题
2020/04/15 Python
Python 程序报错崩溃后如何倒回到崩溃的位置(推荐)
2020/06/23 Python
pytho matplotlib工具栏源码探析一之禁用工具栏、默认工具栏和工具栏管理器三种模式的差异
2021/02/25 Python
加拿大最大的体育用品、鞋类和服装零售商:Sport Chek
2018/11/29 全球购物
行政人事经理职位说明书
2014/03/05 职场文书
运动会标语
2014/06/21 职场文书
教师对照四风自我剖析材料
2014/09/30 职场文书
销售2014年度工作总结
2014/12/08 职场文书
班主任高考寄语
2015/02/26 职场文书
辞职信标准格式
2015/02/27 职场文书
2016年教师寒假学习心得体会
2015/10/09 职场文书
如何用JavaScript实现一个数组惰性求值库
2021/05/05 Javascript
浅谈自定义校验注解ConstraintValidator
2021/06/30 Java/Android
解决linux下redis数据库overcommit_memory问题
2022/02/24 Redis