TIMESTAMP型

TIMESTAMP カラムは DATETIME カラムと同じフォーマットで表示されます。
言い換えると、表示幅は19文字に決められていて、フォーマットは YYYY-MM-DD HH:MM:SS
となります。


mysql> CREATE TABLE timestamp01 (ts1 TIMESTAMP, i INT);
Query OK, 0 rows affected (0.16 sec)

mysql> CREATE TABLE timestamp02 (
-> ts1 TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
-> i INT
-> );
Query OK, 0 rows affected (0.01 sec)

mysql> desc timestamp01;
+-------+-----------+------+-----+-------------------+-----------------------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-----------+------+-----+-------------------+-----------------------------+
| ts1 | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
| i | int(11) | YES | | NULL | |
+-------+-----------+------+-----+-------------------+-----------------------------+
2 rows in set (0.01 sec)

mysql> desc timestamp02;
+-------+-----------+------+-----+-------------------+-----------------------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-----------+------+-----+-------------------+-----------------------------+
| ts1 | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
| i | int(11) | YES | | NULL | |
+-------+-----------+------+-----+-------------------+-----------------------------+
2 rows in set (0.00 sec)

mysql>

timestamp


mysql> INSERT INTO timestamp01 SET ts1=NULL, i=10;
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO timestamp01 SET ts1='', i=10;
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> INSERT INTO timestamp01(i) values(10);
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO timestamp01(ts1,i) values(NULL,10);
Query OK, 1 row affected (0.00 sec)

mysql> select * from timestamp01;
+---------------------+------+
| ts1 | i |
+---------------------+------+
| 2009-07-05 09:23:51 | 10 |
| 0000-00-00 00:00:00 | 10 | ←

    MYSQLの設定にてエラーになる事もあります。

| 2009-07-05 09:24:22 | 10 |
| 2009-07-05 09:24:29 | 10 |
+---------------------+------+
4 rows in set (0.00 sec)

mysql>

timestamp1


mysql> INSERT INTO timestamp02 SET ts1=NULL, i=10;
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO timestamp02 SET ts1='', i=10;
Query OK, 1 row affected, 1 warning (0.01 sec)

mysql> show warnings;
+---------+------+------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------+
| Warning | 1265 | Data truncated for column 'ts1' at row 1 |
+---------+------+------------------------------------------+
1 row in set (0.00 sec)

mysql> INSERT INTO timestamp02(i) values(10);
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO timestamp02(ts1,i) values(NULL,10);
Query OK, 1 row affected (0.00 sec)

mysql> select * from timestamp02;
+---------------------+------+
| ts1 | i |
+---------------------+------+
| 2009-07-05 09:29:10 | 10 |
| 0000-00-00 00:00:00 | 10 |←

    MYSQLの設定にてエラーになる事もあります。

| 2009-07-05 09:29:39 | 10 |
| 2009-07-05 09:29:48 | 10 |
+---------------------+------+
4 rows in set (0.00 sec)

mysql>

timestamp2

MySQLサーバは MAXDB SQLモードが有効な時も実行する事ができます。
このモードが有効な状態でサーバが実行された時、TIMESTAMP は DATETIME
と同一です。これは、もしテーブルが作成された時にこのモードが有効だと、
TIMESTAMP カラムは DATETIME カラムとして作成される、という意味になります。
その結果、そのようなカラムは DATETIME 表示フォーマットを利用し、同じ範囲の値を持ち、
自動初期化機能や、現在の日付と時刻に自動的にアップデートする機能はないという事になります。

MAXDB モードを有効にするには、起動の際に、–sql-mode=MAXDB サーバオプションを
利用するか、ランタイム時にグローバル sql_mode 変数を設定して、サーバSQLのモードを
MAXDB に設定してください。

mysql> SET GLOBAL sql_mode=MAXDB;

クライアントは接続の為に、次のようにサーバを MAXDB モードで起動させる事ができます。

mysql> SET SESSION sql_mode=MAXDB;

次に紹介されている情報は、MAXDB モードが有効な状態で作成されなかった
テーブルだけの TIMESTAMP カラムに適合するという事を覚えておいて下さい。
なぜならば、そのようなカラムは DATETIME カラムとして作成されるからです。

MySQLは、日付か月のカラムにゼロを含むタイムスタンプ値や、有効でない
日付値は許容しません。このルールの唯一の例外は、’0000-00-00 00:00:00′ の特別値です。

————————————————-
INSERT INTO t1 VALUES (NOW());
INSERT INTO t2 VALUES (CURRENT_TIMESTAMP);

timestamp3

参考ページ
10.3.1.1. TIMESTAMP MySQL 4.1での性質

Comments are closed.

Post Navigation