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 数据库树的遍历方法
Feb 06 PHP
php checkbox复选框值的获取与checkbox默认值输出方法
May 15 PHP
PHP学习之正则表达式
Apr 17 PHP
ThinkPHP3.1新特性之多层MVC的支持
Jun 19 PHP
php采集自中央气象台范围覆盖全国的天气预报代码实例
Jan 04 PHP
PHP中Http协议post请求参数
Nov 02 PHP
PHP实现微信网页授权开发教程
Jan 19 PHP
Laravel5权限管理方法详解
Jul 26 PHP
php把文件设置为插件的技巧方法
Feb 03 PHP
PHP实现常用排序算法的方法
Feb 05 PHP
PHP重载基础知识回顾
Sep 10 PHP
PHP解决高并发问题
Apr 01 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根据两点间的经纬度计算距离
2014/10/31 PHP
PHP调用其他文件中的类
2018/04/02 PHP
php实现的表单验证类完整示例
2019/08/13 PHP
在Laravel中使用GuzzleHttp调用第三方服务的API接口代码
2019/10/15 PHP
通过PHP的Wrapper无缝迁移原有项目到新服务的实现方法
2020/04/02 PHP
TNC vs BOOM BO3 第一场2.13
2021/03/10 DOTA
制作特殊字的脚本
2006/06/26 Javascript
Extjs中常用表单介绍与应用
2010/06/07 Javascript
基于jquery的禁用右键、文本选择功能、复制按键的实现代码
2013/08/27 Javascript
基于jquery实现的文字淡入淡出效果
2013/11/14 Javascript
javascript实现根据iphone屏幕方向调用不同样式表的方法
2015/07/13 Javascript
vue组件父子间通信之综合练习(聊天室)
2017/11/07 Javascript
JavaScript创建对象方式总结【工厂模式、构造函数模式、原型模式等】
2018/12/19 Javascript
[05:41]2014DOTA2西雅图国际邀请赛 小组赛7月10日TOPPLAY
2014/07/10 DOTA
简单的抓取淘宝图片的Python爬虫
2014/12/25 Python
Python实现一个Git日志统计分析的小工具
2017/12/14 Python
python模块之paramiko实例代码
2018/01/31 Python
使用Python读取大文件的方法
2018/02/11 Python
NumPy 数学函数及代数运算的实现代码
2018/07/18 Python
pandas 将索引值相加的方法
2018/11/15 Python
python pands实现execl转csv 并修改csv指定列的方法
2018/12/12 Python
对Python Class之间函数的调用关系详解
2019/01/23 Python
python3实现指定目录下文件sha256及文件大小统计
2019/02/25 Python
Python3匿名函数lambda介绍与使用示例
2019/05/18 Python
python提取log文件内容并画出图表
2019/07/08 Python
python GUI库图形界面开发之PyQt5信号与槽的高级使用技巧(自定义信号与槽)详解与实例
2020/03/06 Python
python seaborn heatmap可视化相关性矩阵实例
2020/06/03 Python
深入了解Python 方法之类方法 & 静态方法
2020/08/17 Python
python 用struct模块解决黏包问题
2020/11/07 Python
python 爬虫爬取京东ps4售卖情况
2020/12/18 Python
伯利陶器:Burleigh Pottery
2018/01/03 全球购物
高中军训感想800字
2014/02/23 职场文书
幼儿教师培训感言
2014/03/08 职场文书
委托证明书
2014/09/17 职场文书
2014年档案管理工作总结
2014/11/17 职场文书
公司环境卫生管理制度
2015/08/05 职场文书