表結構:
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 條件與存儲值時區不一致。
北京時間 (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
導出結果時間顯示為北京時間,符合預期。
dump2.sql:mysql -uroot -p test < dump2.sql結論:MySQL 內部以 UTC 存儲 TIMESTAMP,客戶端讀寫自動按會話時區 (time_zone 變量) 轉換。mysqldump 導出 WHERE 條件需按 UTC 編寫,導出/導入過程中時區轉換自動完成,數據邏輯不變。
SET time_zone='+08:00'; 再導出,WHERE 條件可直接用本地時間--tz-utc 參數(mysqldump 5.5+ 支持)強制以 UTC 導出