JSP获取表单元素写入mysql8.0中文乱码问题

注:本文为自己做Web注册项目时,发现读取的表单元素中文显示乱码,由于老师和大多数同学的Mysql都是5.5,而我下的是8.0,编码方式有所改变。自己在网上查了好几个小时终于找到原因了😭,但虽然浪费了几个小时,却又收获很多知识,特此记录一下。😅

1、首先我确定了自己的JSP页面为UTF-8编码
在这里插入图片描述
本以为mysql8也是UTF8编码,但尝试后失败了
在这里插入图片描述
在这里插入图片描述
于是立即找资料发现Mysql8.0编码和低版本的不一样:
查看数据库的字符集
Mysql查看编码方式

show variables like 'character\_set\_%';

在这里插入图片描述
发现database和server为utf8mb4格式!我不明白这和utf8有什么区别,于是查资料得:

  1. Mysql的utf8编码并不是真正的UTF-8编码,Mysql的utf8最多只支持3个字节,而emoji表情、一些特殊的中文字符则需要4个字节才能存储,因此才会报错。
  2. UTF-8编码是U+2528D,属于CJK Unified Ideographs Extension B(中日韩统一表意文字扩充B)字符集的字符,处于第二辅助平面(SIP,表意文字补充平面),最多支持4个字节。而Mysql的utf8编码则属于常见的基本多文种平面(BMP,即Unicode编码范围在0000-FFFF之内)的字符,最多支持3个字节。
  3. utf8mb4可认为是utf8的超集,除了将编码改为utf8mb4外不需要做其他转换。当然,为了节省空间,一般情况下使用utf8也就够了。
  4. 为了获取更好的兼容性,应该总是使用 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"/>

该方法对任何时候起作用(自己测试无效,网上查了很多方法但都失败了)

花费了几个小时,终于解决问题了!🤪【高兴,高兴】

不过也确实学到了很多!

  1. 了解了utf8与utf8mb4关系
  2. 对mysql8.0更熟悉了
  3. 查看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的编码方式!

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员Andy.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值