当前位置: 首页 > 面试题库 >

如何在MySQL数据库中存储Java Instant

刁浩言
2023-03-14
问题内容

使用Java Date对象,最简单的方法是将它们存储为MySql
DateTime对象(在UTC中)。切换到Instant这种方法将不再起作用,因为MySQL
DateTime无法提供存储纳秒的精度。仅将它们截断可能会导致新创建的Instant对象与从数据库读取的对象之间的意外比较结果。

BigDecimal时间戳不适合我作为一个优雅的解决方案:手动编写选择查询变得更加困难,因为必须将时间戳转换到任何地方以使其可读,并且与值Instant甚至Long值相比,Java的处理有些笨拙。

去这里最好的方法是什么?可能不是varchar吧?


问题答案:

显然,我们无法将an的纳秒分辨率压缩Instant为MySQL数据类型DateTimeand 的微秒分辨率Timestamp

我以为JDBC驱动程序在接收到时会忽略纳秒Instant,将值截断为微秒。我建议您尝试一下实验,或者检查符合JDBC
4.2及更高版本的驱动程序的源代码。

Instant instant = Instant.now().with( ChronoField.NANO_OF_SECOND , 123_456_789L ) ;  //Set the fractional second to a spefic number of nanoseconds.
myPreparedStatement.setObject( … , instant ) ;

…和…

Instant instant2 = myResultSet.getObject( … , Instant.class ) ;

然后比较。

Boolean result = instant.equals( instant2 ) ;
System.out.println( "instant: " + instant + " equals instant2: = " + instant2 + " is: " + result ) ;

您明智地担心从数据库中提取的值与原始值不匹配。一种解决方案(如果您的业务问题可以接受的话)是将原始数据中的任何纳秒缩短为几微秒。我通常推荐这种方法。

Instant instant = Instant().now().truncatedTo( ChronoUnit.MICROSECONDS ) ;

目前,这种方法就足够了,因为您不太可能在数据中包含任何纳秒级的数据。据我所知,当今的主流计算机不支持能够捕获纳秒级的硬件时钟。

从时代开始计数

如果您无法承受丢失任何可能存在的纳秒级数据的情况,请使用“从纪元开始计数”。

我通常建议不要跟踪日期时间作为从参考日期开始的计数。但是在将基于纳秒级的值存储在数据库(如MySQL和Postgres)中,除了基于微秒级的值之外,您还有其他选择。

存储整数对

我建议不要使用自1970年1月1日T00:00Z这样的纪元以来的极大量的纳秒,而是建议遵循Instant类的内部方法:使用一 数字。

存储多个 秒为你的数据库的整数。在第二列中,将小数秒中的纳秒数存储为整数。

您可以轻松地将这些数字从Instant对象中提取/注入到对象中。仅long涉及简单的64位数字。不需要BigDecimalBigInteger。我想您可能可以对两个数字中的至少一个使用32位整数列。但是我会选择64位整数列类型,以简化操作并与java.time.Instant类的long对直接兼容。

long seconds = instant.getEpochSecond() ;
long nanos = instant.getNano() ;

…和…

Instant instant = Instant.ofEpochSecond( seconds , nanos ) ;

按时间顺序排序时,您需要进行多级排序,首先在整个秒数列上进行排序,然后在nanos秒的列上进行第二次排序。



 类似资料:
  • 问题内容: 我想将应用程序的版本号存储在MySQL数据库中,例如: 我应该使用哪种数据类型。 问题答案: 您有2个选择: 使用varchar 使用三个数字字段,主要,次要,补丁 同时使用。 每个选项都有其优点和缺点。 选项1只是一个字段,因此很容易获得版本。但这不一定是可排序的,因为从字典上讲2.0.0将高于10.0.0。 选项2可以很容易地进行排序,但是您必须获得三个字段。 选项3可以使用以下视

  • 1366字符串值不正确:“\XF0\X9F\X98\X83\XF0\X9F..."第1行的“comment”列

  • 本文向大家介绍如何在MySQL数据库中存储PayPal十进制数?,包括了如何在MySQL数据库中存储PayPal十进制数?的使用技巧和注意事项,需要的朋友参考一下 为了将PayPal十进制数存储在MySQL数据库中,可以使用DECIMAL(10,2)。让我们首先创建一个表- 使用插入命令在表中插入一些记录- 使用select语句显示表中的所有记录- 这将产生以下输出-

  • 问题内容: 我正在尝试编写一个页面,该页面调用存储在MySQL数据库中的PHP。存储在MySQL数据库中的页面包含要在页面加载时运行的PHP(和HTML)代码。 我该怎么做呢? 问题答案: 您可以为此使用eval命令。 不过,我还是建议不要这样做,因为使用这种方法存在很多陷阱。 调试比较困难,这意味着一些安全隐患(执行数据库中的不良内容,呵呵)。 请参阅何时在php中使用eval邪恶?例如。Goo

  • 问题内容: 我正在开发一个PHP应用程序,该程序需要将各种设置存储在数据库中。客户经常询问是否可以添加或更改/删除某些内容,这已导致表格设计出现问题。基本上,我有很多布尔字段,它们仅指示是否为特定记录启用了各种设置。 为了避免使表格混乱,我考虑将数据存储为序列化数组。我已经读过,这被认为是不好的做法,但是我认为这是使用这种方法的合理案例。 有什么真正的理由避免这样做吗? 任何建议表示赞赏。 谢谢。

  • 问题内容: 我得到了一些“ 锻炼程序” 内容,这些内容将按顺序显示给用户。下面显示了最简单形式的示例。 通常,这些表至少要包含100行/练习,并且大约有300个表(针对不同标准的不同练习)。我们没有任何前端,可以直接使用 _dbForge Studio_数据库编辑器更新数据库。 以前的开发人员已经设计了表格,以便唯一ID列也可用作序列号。它也构成url的一部分。例如xxx / exercise /