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数组函数
Aug 18 PHP
php 不同编码下的字符串长度区分
Sep 26 PHP
php中定义网站根目录的常用方法
Aug 08 PHP
php Smarty初体验二 获取配置信息
Aug 08 PHP
PHP字符串的编码问题的详细介绍
Apr 27 PHP
[原创]php简单防盗链验证实现方法
Jul 09 PHP
session 加入redis的实现代码
Jul 15 PHP
Ajax和PHP正则表达式验证表单及验证码
Sep 24 PHP
CI框架(CodeIgniter)公共模型类定义与用法示例
Aug 10 PHP
php实现与python进行socket通信的方法示例
Aug 30 PHP
PHP通过文件路径获取文件名的实例代码
Oct 14 PHP
php反序列化长度变化尾部字符串逃逸(0CTF-2016-piapiapia)
Feb 15 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 smarty函数扩展
2010/03/15 PHP
PHP实现手机号码中间四位用星号(*)隐藏的自定义函数分享
2014/09/27 PHP
搭建基于Docker的PHP开发环境的详细教程
2015/07/01 PHP
javascript动态添加表格数据行(ASP后台数据库保存例子)
2010/05/08 Javascript
用js控制组织结构图可以任意拖拽到指定位置
2014/01/17 Javascript
AngularJS 中文API参考手册
2016/07/28 Javascript
Javascript数组中push方法用法分析
2016/10/31 Javascript
jQuery控制控件文本的长度的操作方法
2016/12/05 Javascript
Angular实现跨域(搜索框的下拉列表)
2017/02/16 Javascript
使用BootStrap实现标签切换原理解析
2017/03/14 Javascript
JavaScript中this的用法及this在不同应用场景的作用解析
2017/04/13 Javascript
新手vue构建单页面应用实例代码
2017/09/18 Javascript
Vue导出json数据到Excel电子表格的示例
2017/12/04 Javascript
nodejs超出最大的调用栈错误问题
2017/12/27 NodeJs
WebPack配置vue多页面的技巧
2018/05/15 Javascript
js实现点赞效果
2020/03/16 Javascript
vue - props 声明数组和对象操作
2020/07/30 Javascript
在服务器端实现无间断部署Python应用的教程
2015/04/16 Python
Python读取properties配置文件操作示例
2018/03/29 Python
python之从文件读取数据到list的实例讲解
2018/04/19 Python
一些Centos Python 生产环境的部署命令(推荐)
2018/05/07 Python
解决pycharm 误删掉项目文件的处理方法
2018/10/22 Python
对Python正则匹配IP、Url、Mail的方法详解
2018/12/25 Python
python爬取酷狗音乐排行榜
2019/02/20 Python
Pycharm远程调试原理及具体配置详解
2019/08/08 Python
30秒学会30个超实用Python代码片段【收藏版】
2019/10/15 Python
python科学计算之narray对象用法
2019/11/25 Python
html5利用canvas绘画二级树形结构图的示例
2017/09/27 HTML / CSS
HTML5本地数据库基础操作详解
2016/04/26 HTML / CSS
世界上最大的乐器零售商:Guitar Center
2017/11/07 全球购物
全球最受追捧的运动服品牌领先数字目的地:Stylerunner
2020/11/25 全球购物
五年级英语教学反思
2014/01/31 职场文书
财务总监管理岗位职责
2014/03/08 职场文书
特教教师先进事迹
2014/05/21 职场文书
校车安全责任书
2014/08/25 职场文书
SpringBoot集成Druid连接池连接MySQL8.0.11
2021/07/02 Java/Android