Navicat计划任务时间偏差本质是数据库连接时区未对齐:MySQL需在连接高级参数中显式设置serverTimezone=Asia/Shanghai并重输密码生效;PostgreSQL则需在Initial statement中执行SET timezone='Asia/Shanghai';校验同步结果应比对UNIX_TIMESTAMP而非字符串。
Navicat 计划任务里时间字段写错 8 小时
根本不是任务执行时间错了,而是任务运行时连接数据库用的时区没对齐。计划任务启动后会新建一个数据库连接,如果这个连接没显式指定时区,mysql 默认按 utc 存 timestamp、查出来再转成会话时区——而 navicat 新建连接默认用系统本地时区(比如你电脑设的是 utc+8,但服务器是 utc),结果就少 8 小时。
常见现象包括:created_at 字段在目标库变 NULL,或同步后时间显示为 2026-07-28 00:00:00(源库明明是 2026-07-28 08:00:00);执行 SQL 脚本任务时 NOW() 返回值明显偏移。
- 必须进「连接属性 → 高级」手动加参数:
&serverTimezone=Asia/Shanghai&useTimezone=true - 阿里云 RDS 或腾讯云 CDB 等环境可能需写成:
&serverTimezone=GMT%2B8(%2B是 URL 编码后的+) - 改完后要右键连接 → 「编辑连接」→ 重输密码,否则 Navicat 缓存旧握手信息,新参数不生效
- 验证是否生效:连上后执行
SELECT @@time_zone, NOW(), SYSDATE();,三个结果应都落在东八区范围内
PostgreSQL 连接在计划任务里 timezone 总是 UTC
Navicat 16 及更早版本根本不支持在连接参数里传 timezone,你填了也白填。每次新建连接(包括计划任务触发的连接)都会以 UTC 启动会话,SHOW timezone 永远返回 UTC,哪怕 PostgreSQL 服务端已设好 timezone = 'Asia/Shanghai'。
不能靠手动执行 SET timezone = 'Asia/Shanghai'; 解决——计划任务是后台自动跑的,没人工干预窗口。
- 正确做法:进 PostgreSQL 连接 → 「高级」页 → 在「Initial statement」字段填:
SET timezone = 'Asia/Shanghai';(注意结尾分号不能漏) - 这条语句会在每次连接建立后立即执行,比手动 SET 更可靠
- 别信
SHOW timezone的返回值,它可能被中间层覆盖;用SELECT now();对比客户端显示时间更准 - 云数据库(如阿里云 RDS)通常锁死连接参数,这条路走不通时,只能接受服务端强制统一时区(需 DBA 权限)
计划任务本身的时间调度与数据库时区混为一谈
很多人以为“任务在 9:00 执行”就等于“SQL 里 NOW() 返回 9:00”,这是误解。Windows 任务计划程序的触发时间是系统本地时间,而数据库里的时间函数返回值取决于数据库连接的时区设置,两者完全独立。
例如:你在任务计划里设“每天 9:00 执行”,Windows 确实在 9:00 触发 navicatcmd.exe,但它连上 MySQL 后,如果 serverTimezone 没设对,NOW() 还是可能返回 01:00(UTC 时间)。
- 计划任务的「触发时间」只控制 Navicat 进程何时启动,不控制数据库内时间函数的行为
- 确保数据库连接时区正确,才是让
NOW()、SYSDATE()、TIMESTAMP字段写入/读取正确的关键 - 跨时区部署(比如开发机在 UTC+8、RDS 在 UTC)时,务必在每个连接的「高级」里单独配
serverTimezone,不能依赖全局设置
同步任务中时间字段校验失败却显示“成功”
Navicat 数据同步界面显示绿色对勾,不代表时间字段真的一致。因为校验逻辑默认按字节比对,而 TIMESTAMP 在不同连接时区下序列化成字符串后,可能看起来一样,实际含义不同——比如源库存的是 2026-07-28 08:00:00(UTC+8),目标库连的是 UTC 连接,查出来显示为 2026-07-28 00:00:00,但 Navicat 校验时直接比字符串,发现都是 "2026-07-28 00:00:00",就判定一致。
- 校验前先确认两个连接的
serverTimezone参数是否完全一致 - 避免用「逐行比较」模式校验含
TIMESTAMP的表——它读取的是字符串表现形式,不是真实时间点 - 更可靠的校验方式:在源库和目标库分别执行
SELECT UNIX_TIMESTAMP(created_at),对比整数值 - 如果同步任务里用了「时间戳字段」作为更新依据,该字段必须在两张表里都设为
TIMESTAMP类型且连接时区对齐,否则漏同步或重复同步











