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 相关文章推荐
WinXP + Apache +PHP5 + MySQL + phpMyAdmin安装全功略
Jul 09 PHP
Linux下实现PHP多进程的方法分享
Aug 16 PHP
php向js函数传参的几种方法
Aug 10 PHP
Zend Framework框架教程之Zend_Db_Table_Rowset用法实例分析
Mar 21 PHP
Zend Framework实现具有基本功能的留言本(附demo源码下载)
Mar 22 PHP
深入理解PHP 数组之count 函数
Jun 13 PHP
Laravel使用memcached缓存对文章增删改查进行优化的方法
Oct 08 PHP
Laravel中任务调度console使用方法小结
May 07 PHP
利用PHPExcel读取Excel的数据和导出数据到Excel
May 12 PHP
php7新特性的理解和比较总结
Apr 14 PHP
thinkphp5.1框架实现格式化mysql时间戳为日期的方式小结
Oct 10 PHP
PHP配置文件php.ini中打开错误报告的设置方法
Jan 09 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/03/20 PHP
用PHP去掉文件头的Unicode签名(BOM)方法
2017/06/22 PHP
点图片上一页下一页翻页效果
2008/07/09 Javascript
JavaScript 拾碎[三] 使用className属性
2010/10/16 Javascript
js实现window.open不被拦截的解决方法汇总
2014/10/30 Javascript
javascript比较两个日期相差天数的方法
2015/07/23 Javascript
Angular 页面跳转时传参问题
2016/08/01 Javascript
JavaScript实现翻页功能(附效果图)
2017/02/16 Javascript
vue学习笔记之指令v-text && v-html && v-bind详解
2017/05/12 Javascript
聊聊Vue.js的template编译的问题
2017/10/09 Javascript
最新Javascript程序员面试试题和解题方法
2017/11/23 Javascript
JS编写兼容IE6,7,8浏览器无缝自动轮播
2018/10/12 Javascript
Vue匿名插槽与作用域插槽的合并和覆盖行为
2019/04/22 Javascript
微信小程序new Date()方法失效问题解决方法
2019/07/29 Javascript
Vue修改项目启动端口号方法
2019/11/07 Javascript
JS中准确判断变量类型的方法
2020/06/01 Javascript
Python实现统计英文单词个数及字符串分割代码
2015/05/28 Python
python itchat实现微信好友头像拼接图的示例代码
2017/08/14 Python
python使用锁访问共享变量实例解析
2018/02/08 Python
解决Python2.7读写文件中的中文乱码问题
2018/04/12 Python
Django  ORM 练习题及答案
2019/07/19 Python
python3 下载网络图片代码实例
2019/08/27 Python
python实现图片素描效果
2020/09/26 Python
Python中qutip用法示例详解
2020/10/02 Python
Html5大文件断点续传实现方法
2015/12/05 HTML / CSS
伦敦哈德森鞋:Hudson Shoes
2018/02/06 全球购物
Shopee印度尼西亚:东南亚与台湾市场最大电商平台
2018/06/17 全球购物
应付会计岗位职责
2013/12/12 职场文书
搞笑征婚广告词
2014/03/17 职场文书
《宋庆龄故居的樟树》教学反思
2014/04/07 职场文书
《青山处处埋忠骨》教学反思
2014/04/22 职场文书
体育馆的标语
2014/06/24 职场文书
2015年财务部工作总结
2015/04/10 职场文书
2015年度团总支工作总结
2015/04/23 职场文书
傲慢与偏见读书笔记
2015/06/29 职场文书
2016教师政治学习心得体会
2016/01/23 职场文书