timestamp列型別
timestamp值可以從1970的某時的開始一直到2023年,精度為一秒,其值作為數字顯示。
timestamp值顯示尺寸的格式如下表所示:
:+---------------+----------------+
| 列型別 | 顯示格式 |
| timestamp(14) | yyyymmddhhmmss |
| timestamp(12) | yymmddhhmmss |
| timestamp(10) | yymmddhhmm |
| timestamp(8) | yyyymmdd |
| timestamp(6) | yymmdd |
| timestamp(4) | yymm |
| timestamp(2) | yy |
+---------------+----------------+
「完整」timestamp格式是14位,但timestamp列也可以用更短的顯示尺寸創造
最常見的顯示尺寸是6、8、12、和14。
你可以在建立表時指定乙個任意的顯示尺寸,但是定義列長為0或比14大均會被強制定義為列長14。
列長在從1~13範圍的奇數值尺寸均被強制為下乙個更大的偶數。
列如:定義字段長度 強制字段長度
timestamp(0) -> timestamp(14)
timestamp(15)-> timestamp(14)
timestamp(1) -> timestamp(2)
timestamp(5) -> timestamp(6)
所有的timestamp列都有同樣的儲存大小,
使用被指定的時期時間值的完整精度(14位)儲存合法的值不考慮顯示尺寸。
不合法的日期,將會被強制為0儲存
這有幾個含意:
1、雖然你建表時定義了列timestamp(8),但在你進行資料插入與更新時timestamp列
實際上儲存了14位的資料(包括年月日時分秒),
只不過在你進行查詢時mysql返回給你的是8位的年月日資料。
如果你使用alter table拓寬乙個狹窄的timestamp列,以前被「隱蔽」的資訊將被顯示。
2、同樣,縮小乙個timestamp列不會導致資訊失去,除了感覺上值在顯示時,較少的資訊被顯示出。
3、儘管timestamp值被儲存為完整精度,直接操作儲存值的唯一函式是unix_timestamp();
由於mysql返回timestamp列的列值是進過格式化後的檢索的值,
這意味著你可能不能使用某些函式來操作timestamp列(例如hour()或second()),
除非timestamp值的相關部分被包含在格式化的值中。
例如,乙個timestamp列只有被定義為timestamp(10)以上時,timestamp列的hh部分才會被顯示,
因此在更短的timestamp值上使用hour()會產生乙個不可預知的結果。
4、不合法timestamp值被變換到適當型別的「零」值(00000000000000)。(datetime,date亦然)
你可以使用下列語句來驗證:
create table test ('id' int (3) unsigned auto_increment, 'date1' timestamp (8) primary key('id'));
insert into test set id = 1;
select * from test;
+----+----------------+
| id | date1 |
+----+----------------+
| 1 | 20021114 |
+----+----------------+
alter table test change 'date1' 'date1' timestamp(14);
select * from test;
+----+----------------+
| id | date1 |
+----+----------------+
| 1 | 20021114093723 |
+----+----------------+
1、列值沒有明確地在乙個insert或load data infile語句中指定。
2、列值沒有明確地在乙個update語句中指定且另外一些的列改變值。
(注意乙個update設定乙個列為它已經有的值,
這將不引起timestamp列被更新,
因為如果你設定乙個列為它當前的值,mysql為了效率而忽略更改。)
3、你明確地設定timestamp列為null.
4、除第乙個以外的timestamp列也可以設定到當前的日期和時間,只要將列設為null,或now()。
create table test (
'id' int (3) unsigned auto_increment,
'date1' timestamp (14),
'date2' timestamp (14),
primary key('id')
);insert into test (id, date1, date2) values (1, null, null);
insert into test set id= 2;
+----+----------------+----------------+
| id | date1 | date2 |
+----+----------------+----------------+
| 1 | 20021114093723 | 20021114093723 |
| 2 | 20021114093724 | 00000000000000 |
+----+----------------+----------------+
->第一條指令因設date1、date2為null,所以date1、date2值均為當前時間
第二條指令因沒有設date1、date2列值,第乙個timestamp列date1為更新為當前時間,
而二個timestamp列date2因日期不合法而變為「00000000000000」
update test set id= 3 where id=1;
MySQL TIMESTAMP相關問題
在mysql中,不僅是插入就算是修改也會更新timestamp的值!在mysql中要記錄建立日期還得使用datetime 然後使用now 函式完成!1,timestamp default current timestamp 在建立新記錄的時候把這個字段設定為當前時間,但以後修改時,不再重新整理它 2...
MySQLTIMESTAMP 時間戳 詳解
在建立表時如果表中有乙個字段型別為timestamp,則該字段預設的生成語句為 create table test id int 11 default null,ctime timestamp not null default current timestamp on update current ...
MySQL timestamp自動更新時間分享
通常表中會有乙個create date 建立日期的字段,其它資料庫均有預設值的選項。mysql也有預設值timestamp,但在mysql中,不僅是插入就算是修改也會更新timestamp的值!這樣一來,就不是建立日期了,當作更新日期來使用比較好!因此在mysql中要記錄建立日期還得使用dateti...