MySQL UTC时间

背景介绍

项目中为兼容多时区方案,MySQL设计数据库表时,对于时间的设置,最开始才用timeStamp类型

发现一个问题,MySQL TIMESTAMP 2038 限制(Y2038 问题)

概念介绍

UTC 是世界协调时间 ,不随地区变化的全球统一时间

时区是人为定义的,会因为国家规定、政策、夏令时而改变

Y2038时间限制的根源

TIMESTAMP 类型的底层存储逻辑是:将时间转换为 UTC 时间戳,并以32 位有符号整数存储

表达时间有限

32 位有符号整数的最大值:2^31 - 1 = 2147483647

对应 UTC 时间:2038-01-19 03:14:07

超出该值后,32 位整数会溢出为负数,导致时间回绕到 1901-12-13 20:45:52 UTC

所以在MySQL数据库设计中避免使用TIMESTAMP类型

其他数据库有无此限制

数据库 是否有 2038 限制(原生时间类型) 关键说明
MySQL ✅ 有(TIMESTAMP 类型) 普通 TIMESTAMP 基于 32 位整数,DATETIME/ BIGINT 无限制
MariaDB ✅ 有(普通 TIMESTAMP) 10.1+ 新增 TIMESTAMP WITH TIME ZONE(64 位),无 2038 限制
PostgreSQL 时间类型基于 64 位整数,范围覆盖 BC 4713 ~ AD 294276
Oracle DATE/TIMESTAMP 基于字节存储(非时间戳),范围 BC 4712 ~ AD 9999
SQL Server datetime/datetime2 无 2038 限制,smalldatetime 上限 2079(非 2038 问题)
SQLite 无(默认) 无专用时间类型,手动用 32 位整数存时间戳才会触发,64 位 / 字符串存储则无
DB2 TIMESTAMP 范围 0001-01-01 ~ 9999-12-31,无 2038 限制

结论,常见数据库中只有MySQL数据库会有此类问题

使用DateTime类型数据类型

MySQL连接配置

XML 复制代码
spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/your_db?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&useSSL=false

目的: 无论数据库服务器在哪里,都让 JDBC 连接设为 serverTimezone=UTC

Spring Boot 全局使用 UTC

XML 复制代码
spring:
  jackson:
    time-zone: UTC
    date-format: yyyy-MM-dd'T'HH:mm:ss

目的: 防止 Jackson 自动转换时区,返回给前端的所有时间都是 UTC

java 复制代码
@Configuration
public class TimeZoneConfig {

    @PostConstruct
    public void setDefaultTimeZone() {
        TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
    }
}

**目的:**需要设置 JVM 默认时区为 UTC

后台使用类型

推荐使用LocalDateTime,但Date也可以(不带时区,支持UTC)

相关推荐
ccecw3 小时前
Mysql ONLY_FULL_GROUP_BY模式详解、group by非查询字段报错
数据库·mysql
JH30733 小时前
达梦数据库与MySQL的核心差异解析:从特性到实践
数据库·mysql
数据知道3 小时前
PostgreSQL 核心原理:如何利用多核 CPU 加速大数据量扫描(并行查询)
数据库·postgresql
麦聪聊数据4 小时前
Web 原生架构如何重塑企业级数据库协作流?
数据库·sql·低代码·架构
未来之窗软件服务4 小时前
数据库优化提速(四)新加坡房产系统开发数据库表结构—仙盟创梦IDE
数据库·数据库优化·计算机软考
Goat恶霸詹姆斯6 小时前
mysql常用语句
数据库·mysql·oracle
大模型玩家七七6 小时前
梯度累积真的省显存吗?它换走的是什么成本
java·javascript·数据库·人工智能·深度学习
曾经的三心草6 小时前
redis-9-哨兵
数据库·redis·bootstrap
明哥说编程6 小时前
Dataverse自定义表查询优化:D365集成大数据量提速实战【索引配置】
数据库·查询优化·dataverse·dataverse自定义表·索引配置·d365集成·大数据量提速
xiaowu0806 小时前
C# 拆解 “显式接口实现 + 子类强类型扩展” 的设计思想
数据库·oracle