注:本文为自己做Web注册项目时,发现读取的表单元素中文显示乱码,由于老师和大多数同学的Mysql都是5.5,而我下的是8.0,编码方式有所改变。自己在网上查了好几个小时终于找到原因了😭,但虽然浪费了几个小时,却又收获很多知识,特此记录一下。😅
1、首先我确定了自己的JSP页面为UTF-8编码
本以为mysql8也是UTF8编码,但尝试后失败了
于是立即找资料发现Mysql8.0编码和低版本的不一样:
查看数据库的字符集
Mysql查看编码方式
show variables like 'character\_set\_%';
发现database和server为utf8mb4格式!我不明白这和utf8有什么区别,于是查资料得:
- Mysql的utf8编码并不是真正的UTF-8编码,Mysql的utf8最多只支持3个字节,而emoji表情、一些特殊的中文字符则需要4个字节才能存储,因此才会报错。
- UTF-8编码是U+2528D,属于CJK Unified Ideographs Extension B(中日韩统一表意文字扩充B)字符集的字符,处于第二辅助平面(SIP,表意文字补充平面),最多支持4个字节。而Mysql的utf8编码则属于常见的基本多文种平面(BMP,即Unicode编码范围在0000-FFFF之内)的字符,最多支持3个字节。
- utf8mb4可认为是utf8的超集,除了将编码改为utf8mb4外不需要做其他转换。当然,为了节省空间,一般情况下使用utf8也就够了。
- 为了获取更好的兼容性,应该总是使用 utf8mb4 而非 utf8. 对于 CHAR 类型数据,utf8mb4 会多消耗一些空间,根据 Mysql 官方建议,使用 VARCHAR 替代 CHAR。
我直接通过命令进行修改
set character_set_client=utf8;
set character_set_connection=utf8;
set character_set_database=utf8;
set character_set_results=utf8;
set character_set_server=utf8;
(这样修改编码方式重启mysql自动恢复原来状态)
结果还是乱码,失败了,一时间很无语。。。,其实也不用修改,我就是试试,因为上面提到utf8mb4可认为是utf8的超集,也即客户端传到服务器utf8编码可认为是utf8mb4.
又尝试了把Sql语句改为直接传值:
String sql = "insert into user (username,password,email) values('哈哈','555','666')" ;
结果中文并没有乱码!
一时间头大!
又思考:既然编码格式都一致了,为什么还是乱码呢?
再次查阅资料,发现还有Tomcat! JSP乱码的本质!
参考
参考2
tomcat默认全部都是用ISO-8859-1编码,不管你页面用什么显示,Tomcat最终还是会替你将所有字符转做ISO-8859-1.那么,当在另目标页面再用GBK翻译时就会将本来错的编码翻译成GBK的编码,这时的文字会乱码.
类似这样修改代码:
对请求参数进行编码转换
然后:
成功了!
同样也可以用以下两种方法解决request请求的中文乱码问题:
对请求头进行编码转换
request.setCharacterEncoding(“UTF-8”);
(推荐这种方法,放在request.getParameter前面,我用的Tomcat9.0.13,无论get请求还是post请求亲测都有效,但有些文献说低版本的Tomcat此方法仅适用post,这点注意)
对tomcat服务器server.xml文件设置编码
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8"/>
该方法对任何时候起作用(自己测试无效,网上查了很多方法但都失败了)
花费了几个小时,终于解决问题了!🤪【高兴,高兴】
不过也确实学到了很多!
- 了解了utf8与utf8mb4关系
- 对mysql8.0更熟悉了
- 查看mysql编码格式
数据库: show create database test;
表: show create table user;
列: show full columns from t1;
当前联接系统参数 : show variables like ‘char%’;
修改数据库的字符集:alter database test character set utf-8;
创建数据库指定数据库的字符集:create database test character set utf-8;
4.建库时,尽量设定数据库和表的编码!
5.JSP乱码的本质,tomcat默认全部都是用ISO-8859-1编码!需要在代码中修改,或直接修改Tomcat的编码方式!