【数据库】时区及JDBC的时区设置

这篇具有很好参考价值的文章主要介绍了【数据库】时区及JDBC的时区设置。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

JDBC连接时有个TimeZone配置,这玩意到底有用吗?我是使用Postgresql和Mysql两个数据库验证的。结果如下:

数据库 部署方式 版本 JDBC连接TimeZone参数 JDBC连接serverTimezone参数 总结
Mysql docker 8.0 没用 有用,会使用客户端时区与设置的参数时区比较,并返回客户端时区对应的时间,详见实例1 Mysql使用JDBC连接时可以配置serverTimezone参数告诉客户端服务器的时区,因为Mysql的TimeStamp类型是没有时区概念的,且没有timestamp with time zone数据类型,只能通过连接时配置数据库server的时区,并通过两时区的对比,返回正确的客户端时区的时间
Postgresql docker 15.3 没用 没用 Postgresql使用JDBC连接时,时区参数均无效,但Postgresql有timestamp with time zone数据类型,使用该数据类型时不管数据库是什么时区设置,也不管客户端是什么时区设置,只要你的客户端时区不变,你存取得到的都是同一个时间,该时间的时区取决于客户端的时区。数据库中存储的是对应的UTC时区时间,比如:2023-05-24 00:51:24.578703 +00:00,详见实例2

 

实例1:

使用Mysql数据库,建表DDL如下:

create table test
(
    a int       null,
    b timestamp null
);

数据库中存储的数据:

【数据库】时区及JDBC的时区设置

 使用JDBC连接,不配置serverTimezone参数,客户端时区为东八区,执行以下SQL并用Java Date类型接收输出:

SELECT b FROM test WHERE a = 1;
SELECT now();

输出结果,注意Java的Date类型本身是没有时区属性的,这里之所以输出了CST可以自行研究Date的toString方法:

Tue May 23 15:13:46 CST 2023
Wed May 24 01:11:17 CST 2023

使用JDBC连接,配置serverTimezone参数为serverTimezone=UTC,客户端时区为东八区,执行上面的SQL并用Java Date类型接收输出:

Tue May 23 23:13:46 CST 2023
Wed May 24 09:12:52 CST 2023

总结:

当不使用serverTimezone配置时,JDBC连接中服务器时区被认为与客户端时区相同,因此数据库中存储的时间返回时被认为是东八区时间,无需变动,但SELECT now();返回的是Mysql服务器时间,即UTC时间。配置serverTimezone参数后,JDBC连接中服务器时区为UTC,客户端时区为东八区,查询数据库中时间被认为是UTC时间,返回给客户端时进行+8小时操作,同时SELECT now();返回值经过时区转换,正确的返回了东八区时间。

 

实例2:

使用Postgresql数据库,建表DDL如下:

create table test
(
    a integer,
    b timestamp with time zone
);

客户端时区为东八区,分别执行以下SQL:

INSERT INTO test VALUES (2, now());
SELECT b FROM test WHERE a = 2;
SELECT now();

查询结果如下:

Wed May 24 09:39:39 CST 2023
Wed May 24 09:39:39 CST 2023

数据库中存储结果:

【数据库】时区及JDBC的时区设置

修改客户端时区为东九区,重新执行以上SQL:

Wed May 24 10:42:17 KST 2023
Wed May 24 10:42:17 KST 2023

数据库中存储结果:

【数据库】时区及JDBC的时区设置

总结:

使用Postgresql的timestamp with time zone数据类型时,不管数据库是什么时区设置,也不管客户端是什么时区设置,只要你的客户端时区不变,你存取得到的都是同一个时间,该时间的时区取决于客户端的时区。数据库中存储的是转换后的UTC时间。

 

综上:

使用Mysql时,JDBC连接中应正确配置serverTimezone参数;使用Postgresql时,使用timestamp with time zone数据类型。来保证获取时间时时区的正确性。

另外,建议能不用数据库的now()就别用了,数据库时区会搞得你头疼;更近一步,能别用时间(Date)就别用了,时间戳没有时区的概念,当前端需要显示的时候再通过DateFormat或Json转换配置时区即可,可以省去很多需要考虑时区的工作。

 

以上是我自己的实验结果,如果你有不同的结论,欢迎一起探讨。文章来源地址https://www.toymoban.com/news/detail-457080.html

到了这里,关于【数据库】时区及JDBC的时区设置的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • JDBC连接数据库

    目录 一、JDBC概念 1.1Java操作数据库的流程 1.2编写代码步骤 1.3具体操作 二、JDBC API详解 2.1 DriverManager(驱动管理类) 作用 2.2 Connection(数据库连接对象)作用: 2.3 Statement   2.4 ResultSet (结果对象集)作用 2.5 PreparedStatement  三、数据库连接池实现 JDBC 就是使用 Java语言操作关系型

    2024年02月05日
    浏览(53)
  • JDBC入门数据库连接

    JDBC(Java Database Connectivity)是Java程序与数据库进行交互的一种标准接口,它提供了一种简单的方式来连接和操作数据库。在使用JDBC之前,需要先了解以下几个概念: JDBC Driver :JDBC驱动程序是一个Java类,用于将Java应用程序与特定数据库管理系统(DBMS)连接。JDBC驱动程序分

    2023年04月25日
    浏览(46)
  • 数据库——JDBC基本连接步骤

    目录 JDBC概念: JDBC保姆级连接步骤: JDBC连接中用到的对象详解: 1.DriverManager对象(驱动管理对象) 2.Connection对象(连接对象) 3.Statement对象(执行SQL语句的对象) 4.ResultSte对象(结果集) JDBC的全称是:Java数据库连接(Java DataBase Connectivity),它是一套用于执行SQL语句的Jav

    2024年02月07日
    浏览(59)
  • 通过JDBC连接数据库并用Java把数据写入数据库

    目录 1.新建项目 2.在src包下新建lib包,用来存放jar包(下载对应jar包复制到lib包里) 3.右键导入的jar包,找到并单击\\\"添加到库\\\"(add....) 4.在src包下新建bean包,新建class类 5.class类中写数据库表中对应的列名的set get方法、空参、有参(String方法)注意:类名为私有类(private),新建类时数

    2024年02月02日
    浏览(65)
  • MySQL数据库,JDBC连接数据库操作流程详细介绍

    在学完 MySQL 和 Java 后,我们通常会尝试使用 Java编译器 连接 MySQL数据库,从而达到使用编译器来操作数据库的效果。连接的这个过程会用 JDBC 相关知识,因此我把 JDBC 包的下载及导入流程,以及 JDBC 的使用流程整理下来分享给大家。 目录 1. 啥是JDBC? 2. JDBC依赖包 2.1 依赖包

    2024年02月06日
    浏览(97)
  • JDBC p5 数据库连接池

    传统的JDBC数据库使用 DriverManager 来获取, 每次向数据库建立连接的时候都要将 Connection 加载到内存中,再验证IP地址,用户名和密码(0.05 ~ 1 s 时间) 。需要数据库连接的时候,就向数据库要求一个,频繁的进行数据库连接操作将占用很多的系统资源,容易造成服务器崩溃。

    2024年02月15日
    浏览(47)
  • eclipse使用jdbc连接数据库

    下载和mysql对应版本的jar包。 我的mysql下载的8.0.13版本的,所以下载8.0.13的jar包。官网下载地址: https://dev.mysql.com/downloads/connector/j/?os=26 (如果需要下载历史版本,点击 archievs) 下载之后,解压目录,获得jar包。 导入jarb包。 第一步:在eclipse中新建工程JDBC,建立一个lib目录

    2024年02月11日
    浏览(50)
  • JAVA连接数据库 JDBC编程

    提供修改数据库和查询数据库的代码,两者只有很细微的差别         注意在进行连接数据库首先你得下载你对应MYSQL版本的JDBC驱动包,比如MYSQL8.0版本的你就要下载MYSQL8.0版本的JDBC驱动包,MYSQL5.1版本的你就要下载MYSQL5.1版本的JDBC驱动包 我下载的8.0版本的驱动包就是这个

    2024年02月15日
    浏览(55)
  • 【JDBC】Java连接MySQL数据库

    数据库编程指的是通过编程语言与数据库进行交互和操作的过程,包括使用编程语言创建、连接、查询、更新和删除数据库中的数据,以及管理数据库结构和其他相关工作等。 另外,不同的数据库,对应不同的编程语言提供了不同的数据库驱动包,如:MySQL提供了Java的驱动包

    2024年02月15日
    浏览(115)
  • Java-JDBC连接数据库

    目录 一、JDBC开发步骤 1.Java程序连接数据库 1.1引入MySQL驱动包 1.2Java连接MySQL步骤 2 实现增删改查操作 2.1 添加数据 2.2 修改数据 2.3 删除数据 2.4 查询数据 二、JDBC处理相关问题 1 解决SQL注入问题 1.1、问题演示 1.2、解决问题 2 JDBC事务处理 3 获取自增长键值 4 批处理操作 1.1 引入

    2024年02月09日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包