MySQL資料庫中的timestamp型別與時區
MySQL的timestamp型別時間範圍between '1970-01-01 00:00:01' and '2038-01-19 03:14:07',超出這個範圍則值記錄為'0000-00-00 00:00:00',該型別的一個重要特點就是儲存的時間與時區密切相關,上述所說的時間範圍是UTC(Universal Time Coordinated)標準,指的是經度0度上的標準時間,我國日常生活中時區以首都北京所處的東半球第8區為基準,統一使用東8區時間(俗稱北京時間),比UTC要早8個小時,伺服器的時區設定也遵照此標準,因此對應過來timestamp的時間範圍則應校準為'1970-01-01 08:00:01' and '2038-01-19 11:14:07',也就是說東八區的1970-1-1 08:00:01等同於UTC 1970-1-1 00:00:01。
需要特點注意,timestamp型別的時間不僅僅與寫入記錄時的時區有關,顯示時也與時區有關,例如:
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)
如上述所示,根據時區的不同,顯示的日期也是不一樣的,這正是timestamp型別在MySQL日期型別中獨有的時區特點。
如果向timestamp型別列插入的值超出了指定範圍,則實際實際儲存的值為'0000-00-00 00:00:00',並觸發一個警告資訊:
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)
觸發的警告資訊在MySQL層面僅是個警告而並非錯誤,前端應用的try catch捕獲不到,不過,由於實際寫入的資料並非期望值,還是有可能埋下一些隱患,這些隱患一旦顯露,就有可能觸發前端應用出現異常。
對於timestamp型別,在實際應用中務必理解時區的概念,在設定timestamp列預設值,及實際賦值時務必明確寫入的值實際儲存時的狀態,儘量避免埋入隱患。對於現有已經出錯的記錄,可以考慮通過批量UPDATE及修改表結構的方式予以處理。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7607759/viewspace-695482/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- mysql 資料型別TIMESTAMPMySQL 資料型別
- TIMESTAMP型別的時區型別
- oracle中date資料型別與timestamp資料型別的轉換Oracle資料型別
- mysql資料庫date 、datetime、time、timestamp區別MySql資料庫
- Oracle中的TIMESTAMP資料型別Oracle資料型別
- mysql資料庫時間型別datetime、bigint、timestamp的查詢效率比較MySql資料庫型別
- MySQL字元資料型別char與varchar的區別MySql字元資料型別
- oracle將表中date資料型別修改為timestamp資料型別Oracle資料型別
- Sqlserver:timestamp資料型別SQLServer資料型別
- ORACLE TIMESTAMP資料型別Oracle資料型別
- timestamp資料型別求差資料型別
- MapReduce 與 關係型資料庫的區別資料庫
- C#插入Oracle中Timestamp型別資料C#Oracle型別
- MYSQL資料庫型別與JAVA型別對應關係MySql資料庫型別Java
- Mysql資料庫學習(二):資料型別(數值型別 日期和時間型別 字串型別)MySql資料庫資料型別字串
- 關於timestamp資料型別資料型別
- 關於Oracle資料庫與MySQL資料庫的幾點區別Oracle資料庫MySql
- Oracle中的TIMESTAMP型別Oracle型別
- MySQL中TEXT與BLOB欄位型別的區別MySql型別
- 資料庫型別區分資料庫型別
- 資料庫中where與having的區別資料庫
- SQL與NoSQL(關係型與非關係型)資料庫的區別SQL資料庫
- Java中的基本資料型別與引用資料型別Java資料型別
- 建立一個MySQL資料庫中的datetime型別MySql資料庫型別
- MySQL資料庫時區配置MySql資料庫
- 【MySQL資料型別2之--日期時間型別】MySql資料型別
- 關係型資料庫和非關係型資料庫的區別資料庫
- MySQL資料庫int型別的那些事MySql資料庫型別
- (轉)PLS_INTEGER型別與timestamp型別、date、及時間函式型別函式
- MySQL(二) 資料庫資料型別詳解MySql資料庫資料型別
- MySql與Java的時間型別MySqlJava型別
- oracle資料型別date和timestamp的轉化Oracle資料型別
- MySQL 資料庫的對庫的操作及其資料型別悔鋒MySql資料庫資料型別
- 1-02:MySQL中的資料型別MySql資料型別
- DB2 資料庫中的資料型別DB2資料庫資料型別
- MySQL 的資料型別MySql資料型別
- MySQL的資料型別MySql資料型別
- Oracle中Date和Timestamp的區別Oracle