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下关于Cannot use a scalar value as an array的解决办法
Aug 08 PHP
php目录操作函数之获取目录与文件的类型
Dec 29 PHP
ThinkPHP 3.2 数据分页代码分享
Oct 14 PHP
PHP实现批量生成App各种尺寸Logo
Mar 19 PHP
解决ThinkPHP关闭调试模式时报错的问题汇总
Apr 22 PHP
ZF框架实现发送邮件的方法
Dec 03 PHP
php 在字符串指定位置插入新字符的简单实现
Jun 28 PHP
详解Yii2 定制表单输入字段的标签和样式
Jan 04 PHP
php获取微信共享收货地址的方法
Dec 21 PHP
PHP实现的简单组词算法示例
Apr 10 PHP
针对thinkPHP5框架存储过程bug重写的存储过程扩展类完整实例
Jun 16 PHP
PHP获取学生成绩的方法
Nov 17 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
PHPWind与Discuz截取字符函数substrs与cutstr性能比较
2011/12/05 PHP
Smarty简单生成表单元素的方法示例
2016/05/23 PHP
thinkphp制作404跳转页的简单实现方法
2016/09/22 PHP
ajax+php实现无刷新验证手机号的实例
2017/12/22 PHP
关于PhpStorm设置点击编辑文件自动定位源文件的实现方式
2020/12/30 PHP
ExtJS4给Combobox设置列表中的默认值示例
2014/05/02 Javascript
JavaScript使用RegExp进行正则匹配的方法
2015/07/11 Javascript
JavaScript与jQuery实现的闪烁输入效果
2016/02/18 Javascript
javascript中闭包概念与用法深入理解
2016/12/15 Javascript
gulp解决跨域的配置文件问题
2017/06/08 Javascript
JS 判断某变量是否为某数组中的一个值的3种方法(总结)
2017/07/10 Javascript
浅谈Node框架接入ELK实践总结
2019/02/22 Javascript
Vue项目中ESlint规范示例代码
2019/07/04 Javascript
Vue.js实现大屏数字滚动翻转效果
2019/11/29 Javascript
React中使用UMEditor的方法示例
2019/12/27 Javascript
对tensorflow 的模型保存和调用实例讲解
2018/07/28 Python
浅谈Django的缓存机制
2018/08/23 Python
python中dict字典的查询键值对 遍历 排序 创建 访问 更新 删除基础操作方法
2018/09/13 Python
Python+OpenCv制作证件图片生成器的操作方法
2019/08/21 Python
使用Python实现正态分布、正态分布采样
2019/11/20 Python
python Canny边缘检测算法的实现
2020/04/24 Python
python如何删除文件、目录
2020/06/23 Python
详解在Python中使用Torchmoji将文本转换为表情符号
2020/07/27 Python
美国领先的低折扣旅行网站:Hotwire
2019/01/19 全球购物
中软Java笔试题
2012/11/11 面试题
一组SQL面试题
2016/02/15 面试题
什么是规则表达式
2012/05/03 面试题
思想政治自我鉴定
2013/10/06 职场文书
交通事故协议书范文
2014/04/16 职场文书
新闻工作者先进事迹
2014/05/26 职场文书
咖啡店创业计划书
2014/08/15 职场文书
报考公务员诚信承诺书
2014/08/29 职场文书
党员思想汇报材料
2014/12/19 职场文书
Python学习之迭代器详解
2022/04/01 Python
Spring Security使用单点登录的权限功能
2022/04/03 Java/Android
Windows server 2012 R2 安装IIS服务器
2022/04/29 Servers