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产生随机字符串函数
Dec 06 PHP
php面向对象的方法重载两种版本比较
Sep 08 PHP
PHP mail 通过Windows的SMTP发送邮件失败的解决方案
May 27 PHP
php后台多用户权限组思路与实现程序代码分享
Feb 13 PHP
朋友网关于QQ相关的PHP代码(研究QQ的绝佳资料)
Jan 26 PHP
php实现比较两个文件夹异同的方法
Jun 18 PHP
php读取der格式证书乱码解决方法
Jun 22 PHP
php正则去除网页中所有的html,js,css,注释的实现方法
Nov 03 PHP
php compact 通过变量创建数组
Nov 15 PHP
PHP中ajax无刷新上传图片与图片下载功能
Feb 21 PHP
PHP常见的几种攻击方式实例小结
Apr 29 PHP
浅析PHP中的 inet_pton 网络函数
Dec 16 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速度全攻略
2006/10/09 PHP
php生成百度sitemap站点地图类函数实例
2014/10/17 PHP
Firefox div高度自适应
2009/04/28 Javascript
Dom操作之兼容技巧分享
2011/09/20 Javascript
js replace正则表达式应用案例讲解
2013/01/17 Javascript
js替换字符串的所有示例代码
2013/07/23 Javascript
js出生日期 年月日级联菜单示例代码
2014/01/10 Javascript
键盘上一张下一张兼容IE/google/firefox等浏览器
2014/01/28 Javascript
js实现瀑布流的三种方式比较
2020/06/28 Javascript
微信小程序 PHP后端form表单提交实例详解
2017/01/12 Javascript
js微信应用场景之微信音乐相册案例分享
2017/08/11 Javascript
微信小程序之GET请求的实例详解
2017/09/29 Javascript
自定义PC微信扫码登录样式写法
2017/12/12 Javascript
微信小程序如何获取openid及用户信息
2018/01/26 Javascript
小程序如何使用分包加载的实现方法
2019/05/22 Javascript
Vue props中Object和Array设置默认值操作
2020/07/30 Javascript
利用Python中unittest实现简单的单元测试实例详解
2017/01/09 Python
对python判断ip是否可达的实例详解
2019/01/31 Python
Python+Tensorflow+CNN实现车牌识别的示例代码
2019/10/11 Python
Python如何在bool函数中取值
2020/09/21 Python
日本化妆品植村秀俄罗斯官方网站:Shu Uemura俄罗斯
2020/02/01 全球购物
英国第一职业高尔夫商店:Clickgolf.co.uk
2020/11/18 全球购物
写给女生的道歉信
2014/01/08 职场文书
《走一步再走一步》教学反思
2014/02/15 职场文书
《和田的维吾尔》教学反思
2014/04/14 职场文书
“六查”、“三学”、“三干”查摆问题整改措施
2014/09/27 职场文书
捐资助学感谢信
2015/01/21 职场文书
信贷客户经理岗位职责
2015/04/09 职场文书
公司开会通知
2015/04/20 职场文书
春晚观后感
2015/06/11 职场文书
高考百日冲刺决心书
2015/09/23 职场文书
社区干部培训心得体会
2016/01/06 职场文书
《七律·长征》教学反思
2016/02/16 职场文书
如何利用 CSS Overview 面板重构优化你的网站
2021/10/24 HTML / CSS
用Python爬取英雄联盟的皮肤详细示例
2021/12/06 Python
Golang MatrixOne使用介绍和汇编语法
2022/04/19 Golang