JDBC——解决MySQL8.0时区的问题

Posted 瓦特的代码小屋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JDBC——解决MySQL8.0时区的问题相关的知识,希望对你有一定的参考价值。

软件版本

  • Windows:Windows10
  • mysql:mysql-8.0.19

问题描述

java将当前时间保存到MySQL数据库时,MySQL中的时间不正确

SRC源代码

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;

public class JDBCDemo 
    public static void main(String[] args) throws Exception 
        //1、注册驱动
        Class.forName("com.mysql.cj.jdbc.Driver");

        //2、获取连接
        String url="jdbc:mysql://127.0.0.1:3306/db4";
        String username="root";//自己的用户名
        String password="123456";//自己的密码
        Connection conn = DriverManager.getConnection(url, username, password);
        //3、定义sql语句
        String sql="update account set money=2000 where id=1";

        //4、获取执行sql对象Statement
        Statement statement = conn.createStatement();

        //5、执行sql(返回影响的行数)
        int count = statement.executeUpdate(sql);

        //6、处理结果
        System.out.println(count);

        //7、释放资源
        statement.close();
        conn.close();
    

报错信息

Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.
Exception in thread "main" 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.

Caused by: com.mysql.cj.exceptions.InvalidConnectionAttributeException: 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.

首先看报什么错,这里很明显是驱动名和链接的时区问题。

问题分析
原因一:java数据库连接使用UTC时区(世界标准时间),即serverTimezone=UTC

url: jdbc:mysql://localhost:3306/test?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&useSSL=true

原因二:MySQL使用的time_zone属性是+00:00,而北京时间比UTC时间早8小时,即UTC+08:00

解决方法

驱动名字不要写错

  • mysql5.7的是Class.forName("com.mysql.jdbc.Driver");
  • mysql8.0的是Class.forName("com.mysql.cj.jdbc.Driver");

修改mysql的时区

  • 步骤一:修改java中的时区为东八区

// serverTimezone可以设置为北京时间GMT%2B8、上海时间Asia/Shanghai或者香港时间Hongkong
url: jdbc:mysql://127.0.0.1:3306/test?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=true

  • 步骤二:修改MySQL数据库的时区为东八区
  • 方法一:使用命令(优点:不需要重启MySQL服务,缺点:一旦MySQL服务被重启,设置就会消失)

mysql> set time_zone = ‘+8:00’;
mysql> set global time_zone = ‘+8:00’; 

  • 方法二:修改my.ini配置文件(优点:永久保存设置,缺点:需重启MySQL服务)

找到电脑中的my.ini配置文件,在[mysqld]下加上 default-time_zone=‘+8:00’,如下:

[mysqld]
// 设置默认时区
default-time_zone=‘+8:00’

然后重启mysql80,这里也是两种方法,第一就是右击此电脑,管理,找到MySQL80进行重启,第二种是打开命令窗口(以管理员的方式运行)

C:\\WINDOWS\\system32>net stop mysql80
MySQL80 服务正在停止..
MySQL80 服务已成功停止。


C:\\WINDOWS\\system32>net start mysql80
MySQL80 服务正在启动 .
MySQL80 服务已经启动成功。

就解决了问题!

kettle使用jdbc连接mysql之时区问题

  kettle连接mysql报错

   

 

   网上查询后才知道这是时区的问题,解决方法:

  从cmd进入mysql进行操作:

  

  之后成功:

  

 

以上是关于JDBC——解决MySQL8.0时区的问题的主要内容,如果未能解决你的问题,请参考以下文章

jdbc连接mysq之serverTimezone设定

PyCharm Community 2019.2 连接MySQL8.0 时区不同步的解决

Spring Boot连接数据库,从MySql5.13飞跃到MySql8.0.18的坑

[SpringBoot项目]问题及解决总结

MySQL出现时区错误的解决方法

mysql jdbc timezone