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 相关文章推荐
在Windows中安装Apache2和PHP4的权威指南
Oct 09 PHP
探讨PHP删除文件夹的三种方法
Jun 09 PHP
ThinkPHP模板判断输出Present标签用法详解
Jun 30 PHP
PHP链接MySQL的常用扩展函数
Oct 23 PHP
php实现可逆加密的方法
Aug 11 PHP
php猜单词游戏
Sep 29 PHP
PHP常用设计模式之委托设计模式
Feb 13 PHP
浅谈PHP表单提交(POST&GET&URL编/解码)
Apr 03 PHP
ThinkPHP删除栏目(实现批量删除栏目)
Jun 21 PHP
PHP设计模式之模板方法模式实例浅析
Dec 20 PHP
Laravel5.5 手动分页和自定义分页样式的简单实现
Oct 15 PHP
php连接mysql之mysql_connect()与mysqli_connect()的区别
Jul 19 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数组(array)输出的三种形式详解
2013/06/05 PHP
PHP获取数组最后一个值的2种方法
2015/01/21 PHP
在WordPress的后台中添加顶级菜单和子菜单的函数详解
2016/01/11 PHP
php加密解密字符串示例
2016/10/13 PHP
PHP面向对象程序设计之接口的继承定义与用法详解
2018/12/20 PHP
php解决安全问题的方法实例
2019/09/19 PHP
laravel 使用auth编写登录的方法
2019/09/30 PHP
stream.js 一个很小、完全独立的Javascript类库
2011/10/28 Javascript
往光标所在位置插入值的js代码
2013/09/22 Javascript
JavaScript 性能优化小结
2015/10/12 Javascript
解决js图片加载时出现404的问题
2020/11/30 Javascript
Angularjs之filter过滤器(推荐)
2016/11/27 Javascript
详解vue mixins和extends的巧妙用法
2017/12/20 Javascript
laydate时间日历插件使用方法详解
2018/11/14 Javascript
从源码角度来回答keep-alive组件的缓存原理
2021/01/18 Javascript
解决windows下Sublime Text 2 运行 PyQt 不显示的方法分享
2014/06/18 Python
深入浅出分析Python装饰器用法
2017/07/28 Python
Python matplotlib画图实例之绘制拥有彩条的图表
2017/12/28 Python
hmac模块生成加入了密钥的消息摘要详解
2018/01/11 Python
python 文本单词提取和词频统计的实例
2018/12/22 Python
Python爬虫之UserAgent的使用实例
2019/02/21 Python
详解Python学习之安装pandas
2019/04/16 Python
Pyinstaller 打包exe教程及问题解决
2019/08/16 Python
使用pytorch实现论文中的unet网络
2020/06/24 Python
MAC平台基于Python Appium环境搭建过程图解
2020/08/13 Python
CSS3之边框多颜色Border-color属性使用示例
2013/10/11 HTML / CSS
CSS实现半透明边框与多重边框的场景分析
2019/11/13 HTML / CSS
HTML5+CSS3实现拖放(Drag and Drop)示例
2014/07/07 HTML / CSS
美国学校用品、教室和教学商店:Discount School Supply
2018/04/04 全球购物
Notino瑞典:购买香水和美容产品
2019/07/26 全球购物
SQL语言面试题
2013/08/27 面试题
财务会计毕业生个人求职信
2014/02/03 职场文书
爱国主义演讲稿
2014/05/07 职场文书
5.12护士节活动总结
2015/02/10 职场文书
redis中lua脚本使用教程
2021/11/01 Redis
NoSQL优缺点与MongoDB数据库简介
2022/06/05 MongoDB