黑马程序员技术交流社区
标题: 【上海校区】乱码分析和解决方案 [打印本页]
作者: 战行者 时间: 2018-4-19 11:55
标题: 【上海校区】乱码分析和解决方案
本帖最后由 上海分校-小影 于 2018-5-3 16:00 编辑
同学们最近在学习数据库,出现最多的问题就是编码问题了,要么是编码不对无法执行sql语句,要么是乱码无法解决,在这里,我来介绍一下关于中文乱码的终极解决方案,分享出来供大家参考学习,在开始之前,我们先来谈谈为什么会出现中文乱码?
很多新手朋友学习PHP的时候,发现程序中的中文在输出的时候会出现乱码的问题,那么为什么会出现这种乱码的情况呢?一般来说,乱码的出现有2种原因,一种是由于编码(charset) 设置错误,导致浏览器以错误的编码来解析,从而出现了满屏乱七八糟的“天书”,第二种就是文件被以错误的编码打开,然后保存,比如一个文本文件原先是GB2312编码的,却以UTF-8编码打开再保存,就会出现乱码的问题。使用dos系统操作数据库的时候,编码就比较多了,有客户端的编码,服务器的编码,服务器转换数据的编码,服务器返回数据的编码,数据库的默认编码等等...本篇文章,就带大家了解一下,怎么解决乱码的问题。
1. html网页中的乱码
我们在html代码中有一个meta标签,如下:
[AppleScript] 纯文本查看 复制代码
<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8” />
或者
[AppleScript] 纯文本查看 复制代码
<meta charset=”utf-8” />
那么也就意味着我们的内容是以utf8编码的,那么浏览器如果以gbk的编码解析,就一定会乱码了,所以如果乱码了,就改一下浏览器解析的编码,如下图:
这个时候,页面就正常了
2. php页面的乱码
如果php写代码在页面出现乱码了,那么在文档顶部添加一行代码,来声明编码
[AppleScript] 纯文本查看 复制代码
header("Content-Type:text/html;charset=utf-8");
或者
[AppleScript] 纯文本查看 复制代码
echo '<meta charset="utf-8" />';
3. php操作mysql的乱码
如果用php从数据库查询数据,产生了乱码,那么在连接数据库后执行一行代码
[AppleScript] 纯文本查看 复制代码
mysql_query("set names utf8");
然后再保证php的编码和客户端(浏览器)的编码保持一致
4.操作数据库的编码
错误为:Invalid default value for `sex`;这个错误是由于编码不对无法识别sex字段的中文默认值引起的,只需要在执行这条语句之前执行`set names 编码`即可。
因为编码无法写入,查询结果为问号或乱码的,都属于编码问题,在数据中,有一些变量存储的都是各种编码,如下表:
变量名 | |
| |
| 客户端来源使用的字符集,也就是客户端发过来的查询所使用的字符集 |
| Mysql接收到用户查询后按照character_set_client将查询转换为character_set_connection设定的字符集 |
| |
| |
| |
| |
我们使用show variables like "character_set_%";语句可以查看,其中:Character_set_client的意思是告诉服务器,客户端是以什么字符集编码发送的SQL语句;character_set_connetion的作用是服务器收到SQL语句后,按照Character_set_client设定的字符集编码将其转换为character_set_connetion设定的字符集编码,一般就是所操作表的字符集编码;Character_set_results的作用是服务器将数据转换为Character_set_results设定的字符集编码并将其发送给客户端,也就是客户端看到的数据是以这种形式编码的;character_set_database的意思是新建数据库的默认字符集编码;character_set_server决定了数据库的默认字符集编码,也就是我们在创建数据库的时候使用default character set "utf8";语句来声明新建表的字符集;Character_set_system表示元数据的字符集,默认就是utf8,而且不要去更改它,否则,因为类似于用户名密码这种东西,可能用各种奇葩的字符去表示,只有utf8能够容纳它们。如果变成了别的字符集,那么用户名和密码就不能用你想要的字符去表示了。
我们使用"set names utf8";语句来设置的字符集其实是改变了character_set_client和character_set_results以及collation_connection这三者的编码,也就是改变这三者即可保证数据不乱码。
需要注意的是:character_set_database决定了新建数据库的默认字符集,而数据库的字符集又决定了新建表的默认字符集,而表的字符集又决定了字段的默认字符集,如果没有通过DEFAULT CHARACTER SET=xxx来改变表的字符集,则新表就使用character_set_database指定的字符集。
上海传智播客黑马程序员PHP学科
作者: 番茄炒鸡蛋 时间: 2018-6-8 19:17
学习了!很好的解释
作者: pysl 时间: 2018-7-10 19:46
谢谢大佬,学习了!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |