版权声明:本文为 小异常 原创文章,非商用自由转载-保持署名-注明出处,谢谢!
本文网址:https://blog.csdn.net/sun8112133/article/details/79921841
昨天有学生问我:为什么在插入MySQL数据库时出现了中文乱码的问题? 对于他的问题,我也做了一个详细的分析总结,方便以后学生再遇到类似的问题时,可以更好的解决。。
首先我来简单描述一下他的问题:
他是在一个添加页面,输入了一组数据,点击“提交”插入到了数据库表中,再点击“查看全部”,发现刚才插入的数据出现了乱码问题,再用cmd窗口打开数据表,同样也是乱码。以下是截图:
对于这个问题,我们可以从六个方面来考虑!
JDBC 连接 MySQL数据库时出现的乱码问题,从六个方面来考虑:
一、在编写页面时就出现了乱码
二、在浏览器解析时出现了乱码
三、由 JSP编译器 在编译成 Servlet 时出现了乱码
四、由数据库中的字段编码格式引起的乱码
五、JDBC 连接 MySQL数据库 时,没有拼接 useUnicode=true&characterEncoding=utf-8 的参数
六、MySQL中的编码设置的问题
(一般情况是由第四个方面和第五个方面引起的)
下面我们重点讲解一下这六个方面出现乱码的原因,以及如何去解决,还有以后在写项目中如何养成良好的习惯防止类似问题再次发生。
一、在编写页面时就出现了乱码
这个问题的可能性极小,举个简单的例子,就是原来编写文件的编码格式是 UTF-8,编写好后又改成了 GBK 编码格式,也没注意文件中的中文变成了乱码,就直接去浏览器中浏览了。
1、出现的原因
可能我们在编写完文件后,对文件的编码格式又进行了改变,导致在文件中就出现了乱码,那自然在用浏览器浏览时也会出现乱码。
2、解决办法
将原来的编码格式改回去。如果非要改变编码格式,就将出现乱码的地方重新输入中文。
建议:我们尽量在编写文件前就对文件编码格式设置好,编写完文件尽量不要改变文件编码格式,如果非要改变,就再检查一下中文的地方是否出现了乱码。
二、在浏览器解析时出现了乱码
首先来给大家简单解释一下ContentType 这个属性,这个属性主要是让浏览器以什么样的形式、什么编码格式来读取这个文件,也就是设置浏览器的解析方式。
我们常见的设置方式:ContentType=”text/html; charset=UTF-8”(浏览器将以html的形式,编码格式为UTF-8来解析这个html文件)
1、出现的原因
1)ContentType属性 可能没有设置 或 设置有误;
2)可能手动更改过浏览器解析的编码格式,
2、解决办法
检查是否正确设置了 ContentType 的值中编码格式。这里以 JSP页面举例,在第一行加以下代码:
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %>
如果是手动更改过浏览器解析的编码,请重新打开浏览器即可。
建议:在编写页面时,一定要记住设置 ContentType属性,最好不要手动更改浏览器的默认解析编码。
三、由 JSP编译器 在编译成 Servlet 时出现了乱码
这个方面是由 JSP页面 引起的,如果不是 JSP页面 引起的乱码,这方面因素可不用考虑。pageEncoding 这个属性主要是用来设置 JSP编译器在将JSP文件编译成Servlet时使用的编码格式。
1、出现的原因
JSP页面 中可能没有设置 pageEncoding 这个属性。
2、解决办法
检查出现乱码的 JSP页面 是否设置pageEncoding 这个属性。如果没有设置,请在第一行加以下代码:
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %>
建议:在编写 JSP页面 时,一定要在第一行写以上代码。
四、由数据库中的字段编码格式引起的乱码
在 MySQL中,数据库、数据表、表字段都有自己的编码格式。
点击这里可以学习如何查看和修改数据库、数据表、表字段的编码格式。
1、出现的原因
可能在建表的时候没有指定表或字段的编码格式,或者指定的编码格式和我们想要的编码格式不一致。
2、解决办法
通过以下SQL语句查询引起乱码的字段的编码格式:
SHOW FULL COLUMNS FROM <表名>;
如果查询出来的结果和我们想要的编码格式相同,则可以考虑其他方面的因素,若不一致,那就请再通过以下SQL语句修改出现乱码对应的字段的编码格式:
ALTER TABLE <表名> MODIFY COLUMN <字段名> <字段类型> CHARACTER SET <编码格式>;
建议:在建立表的时候我们最好设置一下默认的编码格式
五、JDBC连接 MySQL数据库 时,没有拼接 useUnicode=true&characterEncoding=utf-8 的参数
useUnicode=true 与 characterEncoding=utf-8 的意思是:使用Unicode编码,字符编码为UTF-8。因为UTF-8属于Unicode编码,所以要将 useUnicode 的属性值设为 true,两个参数最好全部加上。
1、出现的原因
可能在 JDBC中 连接数据库时的URL后面忘记拼接 useUnicode=true&characterEncoding=utf-8 的参数。
2、解决办法
找到 JDBC连接数据库 的URL,如果没有拼接 useUnicode=true&characterEncoding=utf-8 的参数,就在后面加上。
注意:在xml配置文件中配置数据库URL时,要使用 & 的转义字符,也就是 &
(很多人死在了这个上面)
六、MySQL中的编码设置的问题
以上方面都考虑过了,如果在cmd窗口中依然还出现问号的现象,那就应该是MySQL中的编码设置的问题了。
点击这里查看关于 MySQL 的编码如何进行设置。
七*、JDBC 连接 MySQL良好的编码设置习惯
我们在写代码中,要养成良好的编码设置习惯,将所有的编码全部设置成UTF-8,因为UTF-8是国际化的编码,又称为万国码(关于UTF-8编码,感兴趣的朋友可以上网查询资料,这里不作过多讲解),很多语言都支持UTF-8的编码,一般情况下不会产生错误的结果。
1、将文件的编码格式改成 UTF-8编码格式,再开始编写代码;
2、在页面中所有设置编码的地方全部设置成 UTF-8编码格式;
3、在JDBC连接 MySQL的URL后一定要记住拼接useUnicode=true&characterEncoding=utf-8 这两个参数。