视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
总结mysql php乱码问题
2020-11-02 18:47:33 责编:小采
文档


php读mysql时,有以下几个地方涉及到了字符集。

1. 建立数据库表时指定数据库表的字符集。例如

 create table tablename 
 ( 
 id int not null auto_increment, 
 title varchar(20) not null, 
 primary key ('id') 
 )DEFAULT CHARSET =UTF8;

如果在创建表时没有指定表的字符集,则使用表所属的数据库的默认字符集。该字符集由character_set_database指定。
查看数据库表所使用的字符集的方法是:

show create table mytable;

(PS:建立数据库/表和进行数据库操作时尽量显式指出使用的字符集,而不是依赖于MySQL的默认设置,否则MySQL升级时可能带来很大困扰[1])

2. mysql的字符集
mysql中有三个重要的变量,character_set_client,character_set_results,character_set_connection。
通过设置character_set_client,告诉Mysql,PHP存进数据库的是什么编码方式。
通过设置character_set_results,告诉Mysql,PHP需要取什么样编码的数据。
通过设置character_set_connection,告诉Mysql,PHP查询中的文本,使用什么编码。

3. 连接数据库后,设置数据库间传输字符时所用的默认字符编码。
使用mysqli::set_charset()或mysqli::query('set names utf8'),进行设置。
尽量使用mysqli::set_charset(mysqli:set_charset)而不是”SET NAMES”(参考这篇文章)

$db = new mysqli('localhost','user','passwd','database_name');$db->set_charset('utf8');

注意是utf8,不是utf-8
(这里有个问题就是,数据库和php都已经统一了编码,但是如果没有调用mysqli::set_charset()函数时,读出数据时仍然会出现乱码。这是为什么?)
(另,set names utf8相当于下面三句
SET character_set_client = utf8;
SET character_set_results = utf8;
SET character_set_connection = utf8;

4. html页面使用的字符集。在meta标签中设置

<meta http-equiv="content-type" content="text/html; charset=utf-8">

5. php文本文件所使用的字符集。
在linux下可以用vim打开文件,输入
:set encoding
查看文件使用的字符集

要保证不乱码,需要保证文件自身的编码,HTML里指定的编码,PHP告诉Mysql的编码(包括character_set_client和character_set_results)统一。同时使用mysqli:set_charset()函数或”SET NAMES”。

针对“3”后面的问题,写了几个例子,测试链接数据库后,设置和不设置字符集时的结果。测试环境Ubuntu 12.04,MySQL 5.5,php 5.5.7。
结果如下:
(1) 数据库表字符集是utf8,不使用set names utf8
能正常插入、读出中文,但是在mysql中显示乱码

(2) 数据库表字符集是utf8,使用set names utf8
能正常插入、读出中文,mysql中显示正确

(3) 数据库表字符集不是utf8,使用set names utf8
mysql中显示,读出都是问号。

很多相关知识,请访问PHP中文网!

下载本文
显示全文
专题