jdbc 连接mysql异常及插入中文出现乱码

本文介绍了在使用JDBC连接MySQL时遇到的时间区域异常及插入中文出现乱码的两个问题。针对时间区域异常,可以通过设置MySQL的全局time_zone或在JDBC连接URL中指定时区解决。对于中文乱码,调整数据库和表格的字符集为UTF-8,以及在JDBC连接URL中指定字符编码可以有效避免。分析了从浏览器到数据库的流程,确保了数据传输过程中中文的正确处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、调用getConnection()连接数据库就会报出异常

 DriverManager.getConnection(SQL_URL, SQL_USERNAME, SQL_PASSWORD);

通过控制台打印看到,每次调用这个函数就会发生异常。

java.sql.SQLException: The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support.

网上查了一下,说是安装mysql 设置的时区不正确导致,重新设置mysql 的时区,如下

mysql> set global time_zone='+8:00';

这样貌似问题可以解决了,但是数据库如果重启了之后,又会出现一样的错误。可以通过另外一种方式来解决这个错误,在连接数据库的url中设置时区

private static final String SQL_URL = "jdbc:mysql://localhost:3306/db_test;

 改成

private static final String SQL_URL = "jdbc:mysql://localhost:3306/db_test?serverTimezone=GMT%2B8"; 

这样也可以解决时区不对的问题。

 

2、往mysql数据库中插入中文出现乱码

mysql 数据库是安装在window 上,jee开发环境也是在window,文件的编码也设置成了utf-8格式。但是发现从页面提交过来的中文字符,插入数据库后出现了???这样的乱码。

于是把数据和里面表格的编码设置成utf-8 

mysql> alter database db_test character set utf-8;

设置表格编码 alter table table_name character set utf-8;

修改之后,插入中文也不会再是乱码了,导出war包放到ubutun的服务器进行部署,运行起来后,从页面提交的中文字符还是出现乱码,在window 上没有问题,到ubutun上就出现乱码,是两个系统的字符编码不一样导致的吗?

把ubutun 上mysql 里面的数据库和表格的编码都指定成utf-8 ,其实在一开始就这样设置了,查看也是utf-8编码,在命令窗口中直接插入中文,再查询出来中文也是可以正常显示。我们吧网页到数据库的流程梳理一下

浏览器(网页)->后台(tomcat)->数据库(mysql)

另外一个流程:数据库(mysql)->后台(tomcat)->浏览器(网页)

能够正常显示中文,但是从页面提交上来的中文到数据库里面就是乱码,现在最好的版本就是在后台打印一下收到的中文是不是已经出现乱码了,同时也做了下面的修改

private static final String SQL_URL = "jdbc:mysql://localhost:3306/db_test?serverTimezone=GMT%2B8"; 

改成

private static final String SQL_URL = "jdbc:mysql://localhost:3306/db_test?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8";

也是修改数据库连接的url,指定字符编码,修改了之后,中文乱码的问题也解决了,后台打印看到接收到的中文也是正常的,所以应该是提交到数据库时,数据库没有按照utf-8格式来接收才导致的中文乱码。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值