理解 MySQL 中的時區
背景知識:日期時間、時間戳和時區
在大多數情況下,日期和時間指的是本地時區的當前時間。例如,當你看到 "2024-06-15 12:00:00"
時,意味着現在是 2024 年 6 月 15 日 12:00:00 在你的本地時區。
然而,當你的應用爲不同時區的用戶提供服務時,你需要考慮時區的問題。例如,如果一個紐約的用戶在 "2024-06-15 12:00:00"
創建了一條記錄,那麼這條記錄是在紐約時區的 12:00:00 創建的。如果另一個在北京的用戶查看這條記錄,時間應該被轉換爲北京時區。
總之,日期時間是本地時區的時間,你應該向日期時間添加時區信息,以使其在全球範圍內可用。
另一方面,時間戳是自 1970 年 1 月 1 日 00:00:00 UTC 起經過的秒數。時間戳是與時區無關的,無論你身在何處,它始終保持不變。
MySQL 中的日期時間數據類型
在 MySQL 中,有幾種日期時間數據類型,但最重要的是 DATETIME
和 TIMESTAMP
。
DATETIME
:日期和時間,格式爲YYYY-MM-DD HH:MM:SS
。它存儲日期和時間,因此必須考慮時區。TIMESTAMP
:時間戳,它存儲時間戳數字,是與時區無關的。但當您寫入或讀取時間戳時,會進行時區轉換。
MySQL 中的時區
MySQL 有一個系統變量 time_zone
用於設置時區。您可以通過以下方式設置時區:
在配置文件
my.cnf
中設置時區:ini[mysqld] default-time-zone = '+00:00'
在 MySQL 客戶端中設置時區:
sqlSET time_zone = '+00:00';
在連接字符串中設置時區:
sqlmysql -u root -p --default-time-zone='+00:00'
如果您沒有設置時區,MySQL 將默認使用系統時區。
在應用程序中設置時區
當您在應用程序中使用 MySQL 時,應該在應用程序中設置時區。例如,在 Node.js 中,您可以這樣設置時區:
const mysql = require('mysql2');
const conn = mysql.createConnection({
host: 'localhost',
user: 'root',
password: 'password',
database: 'test',
timezone: '+00:00'
});
請注意,在許多情況下,在應用程序中設置時區是確保時區正確的唯一方法。因爲您可能無法接觸 MySQL 服務器,但您總是可以更改應用程序代碼。
如果您的應用程序使用某些不支持設置時區的 ORM,您仍然有其他選項:
- 在任何其他查詢之前執行時區設置查詢 (
SET time_zone = '+00:00';
) - 使用不同的數據類型存儲日期時間,例如
INT
或VARCHAR
,並在應用程序中處理時區轉換。 - 在將任何日期時間值寫入數據庫之前,將其轉換爲與 MySQL 服務器相同的時區。在讀取日期時間值時,您還必須在應用程序中執行時區轉換。
結論
在本文中,我們學習了日期時間、時間戳和時區的背景知識:日期時間應該包含時區信息,時間戳是獨立於時區的。然後我們學習了MySQL中的日期時間數據類型:DATETIME
和 TIMESTAMP
。最後,我們學習瞭如何在MySQL和應用程序中設置時區。