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 文件上传系统手记
Oct 26 PHP
PHP strtok()函数的优点分析
Mar 02 PHP
PHP 魔术函数使用说明
May 14 PHP
php数组函数序列之in_array() - 查找数组中是否存在指定值
Nov 07 PHP
PHP 第二节 数据类型之字符串类型
Apr 28 PHP
PHP读取数据库并按照中文名称进行排序实现代码
Jan 29 PHP
php生成二维码的几种方式整理及使用实例
Jun 03 PHP
php分页示例分享
Apr 30 PHP
Win10 下安装配置IIS + MySQL + nginx + php7.1.7
Aug 04 PHP
Laravel5.1 框架路由基础详解
Jan 04 PHP
php设计模式之正面模式实例分析【星际争霸游戏案例】
Mar 24 PHP
PHP设计模式之迭代器模式Iterator实例分析【对象行为型】
Apr 26 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 清空varnish 缓存的详解(包括指定站点下的)
2013/06/20 PHP
php多层数组与对象的转换实例代码
2013/08/05 PHP
Thinkphp实现站点静态化的方法详解
2017/03/21 PHP
统一接口:为FireFox添加IE的方法和属性的js代码
2007/03/25 Javascript
一个用javascript写的select支持上下键、首字母筛选以及回车取值的功能
2009/09/09 Javascript
关于hashchangebroker和statehashable的补充文档
2011/08/08 Javascript
13 个JavaScript 性能提升技巧分享
2012/07/26 Javascript
JS原型对象通俗"唱法"
2012/12/27 Javascript
jquery对象和DOM对象的区别介绍
2013/08/09 Javascript
javascript(js)的小数点乘法除法问题详解
2014/03/07 Javascript
jquery实现的导航固定效果
2014/04/28 Javascript
JQuery分屏指示器图片轮换效果实例
2015/05/21 Javascript
Bootstrap 最常用的JS插件系列总结(图片轮播、标签切换等)
2016/07/14 Javascript
深入理解Angularjs中的$resource服务
2016/12/31 Javascript
jQuery实现三级联动效果
2017/03/02 Javascript
详解nodejs模板引擎制作
2017/06/14 NodeJs
jQuery选择器之属性过滤选择器详解
2017/09/28 jQuery
vue之封装多个组件调用同一接口的案例
2020/08/11 Javascript
Vue利用localStorage本地缓存使页面刷新验证码不清零功能的实现
2020/09/04 Javascript
OpenLayers加载缩放控件使用方法详解
2020/09/25 Javascript
vue常用高阶函数及综合实例
2021/02/25 Vue.js
[04:45]上海特级锦标赛主赛事第三日TOP10
2016/03/05 DOTA
python实现rest请求api示例
2014/04/22 Python
利用Python-iGraph如何绘制贴吧/微博的好友关系图详解
2017/11/02 Python
Python 基于wxpy库实现微信添加好友功能(简洁)
2019/11/29 Python
全方位了解CSS3的Regions扩展
2015/08/07 HTML / CSS
HTML5实现直播间评论滚动效果的代码
2020/05/27 HTML / CSS
Johnston & Murphy官网: 约翰斯顿·墨菲牛津总统鞋
2018/01/09 全球购物
自动化专业个人求职信范文
2013/11/29 职场文书
私人委托书格式
2014/09/10 职场文书
师德师风个人自我剖析材料
2014/09/27 职场文书
2015法院个人工作总结范文
2015/05/25 职场文书
校长新学期寄语2016
2015/12/04 职场文书
学习杨善洲同志先进事迹心得体会
2016/01/23 职场文书
golang 如何用反射reflect操作结构体
2021/04/28 Golang
Redis集群新增、删除节点以及动态增加内存的方法
2021/09/04 Redis