MySQL timestamp的類型與時區(qū)
MySQL的timestamp類型時間范圍between '1970-01-01 00:00:01' and '2038-01-19 03:14:07',超出這個范圍則值記錄為'0000-00-00 00:00:00',該類型的一個重要特點就是保存的時間與時區(qū)密切相關,上述所說的時間范圍是UTC(Universal Time Coordinated)標準,指的是經(jīng)度0度上的標準時間,我國日常生活中時區(qū)以首都北京所處的東半球第8區(qū)為基準,統(tǒng)一使用東8區(qū)時間(俗稱北京時間),比UTC要早8個小時,服務器的時區(qū)設置也遵照此標準,因此對應過來timestamp的時間范圍則應校準為'1970-01-01 08:00:01' and '2038-01-19 11:14:07',也就是說東八區(qū)的1970-1-1 08:00:01等同于UTC 1970-1-1 00:00:01。
需要特點注意,timestamp類型的時間不僅僅與寫入記錄時的時區(qū)有關,顯示時也與時區(qū)有關,例如:
mysql> desc j1_dt;
+-------+-----------+------+-----+-------------------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-----------+------+-----+-------------------+-------+
| dt | timestamp | NO | | CURRENT_TIMESTAMP | |
+-------+-----------+------+-----+-------------------+-------+
1 row in set (0.00 sec)
mysql> insert into j1_dt values ('1970-01-01 08:00:01');
Query OK, 1 row affected (0.00 sec)
mysql> select * from j1_dt;
+---------------------+
| dt |
+---------------------+
| 1970-01-01 08:00:01 |
+---------------------+
1 row in set (0.00 sec)
mysql> set time_zone='+0:00';
Query OK, 0 rows affected (0.00 sec)
mysql> select * from j1_dt;
+---------------------+
| dt |
+---------------------+
| 1970-01-01 00:00:01 |
+---------------------+
1 row in set (0.00 sec)
mysql> set time_zone='+1:00';
Query OK, 0 rows affected (0.00 sec)
mysql> select * from j1_dt;
+---------------------+
| dt |
+---------------------+
| 1970-01-01 01:00:01 |
+---------------------+
1 row in set (0.00 sec)
如上述所示,根據(jù)時區(qū)的不同,顯示的日期也是不一樣的,這正是timestamp類型在MySQL日期類型中獨有的時區(qū)特點。
如果向timestamp類型列插入的值超出了指定范圍,則實際實際保存的值為'0000-00-00 00:00:00',并觸發(fā)一個警告信息:
mysql> set time_zone='+8:00';
Query OK, 0 rows affected (0.00 sec)
mysql> select * from j1_dt;
+---------------------+
| dt |
+---------------------+
| 1970-01-01 08:00:01 |
+---------------------+
1 row in set (0.00 sec)
mysql> insert into j1_dt values ('1970-01-01 00:00:01');
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> show warnings;
+---------+------+------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------+
| Warning | 1264 | Out of range value adjusted for column 'dt' at row 1 |
+---------+------+------------------------------------------------------+
1 row in set (0.00 sec)
mysql> select * from j1_dt;
+---------------------+
| dt |
+---------------------+
| 1970-01-01 08:00:01 |
| 0000-00-00 00:00:00 |
+---------------------+
2 rows in set (0.00 sec)
觸發(fā)的警告信息在MySQL層面僅是個警告而并非錯誤,前端應用的try catch捕獲不到,不過,由于實際寫入的數(shù)據(jù)并非期望值,還是有可能埋下一些隱患,這些隱患一旦顯露,就有可能觸發(fā)前端應用出現(xiàn)異常。
對于timestamp類型,在實際應用中務必理解時區(qū)的概念,在設置timestamp列默認值,及實際賦值時務必明確寫入的值實際保存時的狀態(tài),盡量避免埋入隱患。對于現(xiàn)有已經(jīng)出錯的記錄,可以考慮通過批量UPDATE及修改表結構的方式予以處理。
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
您可能感興趣的文章:- 通過實例解析MySql CURRENT_TIMESTAMP函數(shù)
- MySQL的時間差函數(shù)TIMESTAMPDIFF、DATEDIFF的用法
- MySQL的時間差函數(shù)(TIMESTAMPDIFF、DATEDIFF)、日期轉換計算函數(shù)(date_add、day、date_format、str_to_date)
- MySQL中datetime和timestamp的區(qū)別及使用詳解
- MySQL 5.6 中 TIMESTAMP有那些變化
- MySQL 5.6 中的 TIMESTAMP 和 explicit_defaults_for_timestamp 參數(shù)
- Mysql中的Datetime和Timestamp比較
- mysql 數(shù)據(jù)類型TIMESTAMP
- 為什么MySQL 使用timestamp可以無視時區(qū)問題.