MySQL 5.6 前 DATETIME/TIMESTAMP 精度僅到秒,無原生毫秒類型。但引擎能識別時間字串中的微秒部分,可通過以下兩種模式實現毫秒/微秒存儲。
CREATE TABLE mysql_microsecond ( log_time_prefix TIMESTAMP(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6), log_time_suffix MEDIUMINT NOT NULL DEFAULT 0, PRIMARY KEY (log_time_prefix, log_time_suffix) ) ENGINE=InnoDB; -- 寫入範例 SET @dt = CONVERT(CONCAT(NOW(),'.222009'), DATETIME(6)); INSERT INTO mysql_microsecond SELECT DATE_FORMAT(@dt, '%Y-%m-%d %H-%i-%s'), DATE_FORMAT(@dt, '%f'); -- 查詢結果 +---------------------+-----------------+ | log_time_prefix | log_time_suffix | +---------------------+-----------------+ | 2009-08-11 17:47:02 | 222009 | +---------------------+-----------------+
DATETIME(6)/TIMESTAMP(6) 微秒精度,可直接單欄存儲,無需拆分log_time_prefix)CREATE TABLE log_ms ( log_time VARCHAR(26) NOT NULL, -- '2024-01-15 12:34:56.123456' PRIMARY KEY (log_time) ) ENGINE=InnoDB;
CREATE TABLE log_us ( log_time_us BIGINT UNSIGNED NOT NULL, -- 微秒級 epoch PRIMARY KEY (log_time_us) ) ENGINE=InnoDB;
System.currentTimeMillis() * 1000 (Java)、time.time() * 1_000_000 (Python)| 場景 | 推薦 |
|---|---|
| MySQL 5.6.4+、新建表 | DATETIME(6) / TIMESTAMP(6) 單欄 |
| 舊版本、需分區、主鍵含時間 | 拆分欄位 (TIMESTAMP + MEDIUMINT) |
| 高寫入、日誌/指標類、跨系統 | BIGINT Unix 微秒戳 |
| 異構遷移、臨時方案 | VARCHAR ISO 8601 |