首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

mysqldump 導出 TIMESTAMP 字段時區偏移 8 小時問題分析與解決

     編輯:MySQL 資料庫相關知識

問題現場複現

表結構:


CREATE TABLE dump (
  id BIGINT NOT NULL DEFAULT 0,
  timestamp TIMESTAMP NOT NULL,
  PRIMARY KEY (id)
);

插入數據:INSERT INTO dump VALUES(1, '2010-01-05 01:01:00'); 等多條。

現象:導出條件與結果時間不匹配

目標導出 2010-01-05 全天數據,執行:


mysqldump -t --extended-insert=false \
  -w "timestamp BETWEEN '2010-01-05 00:00:00' AND '2010-01-05 23:59:59'" \
  test dump -uroot -p > dump1.sql

結果:導出數據時間比條件早 8 小時(如 2010-01-04 16:00:00),即 UTC 時間。MySQL 將 TIMESTAMP 存儲為 UTC,導出時按會話時區轉換,導致 WHERE 條件與存儲值時區不一致。

解決:WHERE 條件按 UTC 時間編寫

北京時間 (UTC+8) 2010-01-05 00:00:00 對應 UTC 2010-01-04 16:00:00。


mysqldump -t --extended-insert=false \
  -w "timestamp BETWEEN '2010-01-04 16:00:00' AND '2010-01-05 15:59:59'" \
  test dump -uroot -p > dump2.sql

導出結果時間顯示為北京時間,符合預期。

驗證:導入後時間自動轉回

  1. 刪除原表部分數據
  2. 導入 dump2.sql:mysql -uroot -p test < dump2.sql
  3. 查詢表中數據,時間欄位顯示為原始北京時間(如 01:01:00)

結論:MySQL 內部以 UTC 存儲 TIMESTAMP,客戶端讀寫自動按會話時區 (time_zone 變量) 轉換。mysqldump 導出 WHERE 條件需按 UTC 編寫,導出/導入過程中時區轉換自動完成,數據邏輯不變。

最佳實踐建議

  • 導出前設置會話時區:SET time_zone='+08:00'; 再導出,WHERE 條件可直接用本地時間
  • 或統一應用層使用 UTC,避免時區困擾
  • 使用 --tz-utc 參數(mysqldump 5.5+ 支持)強制以 UTC 導出
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved