插件窝 干货文章 Prisma 操作 MySQL 数据时间少 8 小时,怎么回事?

Prisma 操作 MySQL 数据时间少 8 小时,怎么回事?

时区 设置 MySQL 时间 556    来源:    2025-04-01

MySQL 时间少8小时问题分析

问题描述

使用Prisma操作MySQL数据库时,发现时间数据比实际时间少了8小时。

常见原因

  1. 时区设置不一致

    • MySQL服务器时区设置
    • 应用服务器时区设置
    • Prisma连接配置时区
  2. 时间类型处理差异

    • MySQL的TIMESTAMP类型会受时区影响
    • DATETIME类型则不受时区影响

解决方案

方案1:统一时区设置

// 在Prisma连接字符串中指定时区
datasource db {
  provider = "mysql"
  url      = "mysql://user:password@localhost:3306/db?connection_limit=5&timezone=Asia/Shanghai"
}

方案2:在应用层处理时区

// 设置Node.js应用的时区
process.env.TZ = 'Asia/Shanghai';

方案3:检查MySQL服务器时区

-- 查看MySQL当前时区设置
SELECT @@global.time_zone, @@session.time_zone;

-- 设置全局时区(需要管理员权限)
SET GLOBAL time_zone = '+8:00';

方案4:使用DATETIME替代TIMESTAMP

如果业务允许,使用DATETIME类型存储时间,它不受时区影响。

验证方法

  1. 直接查询MySQL确认存储的时间值
  2. 检查Prisma查询返回的时间值
  3. 比较两者差异是否正好8小时(东八区)

其他注意事项

  • 确保数据库连接池中的连接也应用了正确的时区设置
  • 在Docker环境中运行时,检查容器时区设置
  • 生产环境和开发环境时区设置应保持一致

希望以上解决方案能帮助您解决问题。如果仍有疑问,可以提供更多环境信息以便进一步分析。