MySQL - 5.6 系で TIMESTAMP 型デフォルト値警告!
Updated:
MySQL サーバ 5.6 系でサービス起動時等に以下のような警告メッセージがログに出力されます。
[Warning] TIMESTAMP with implicit DEFAULT value is deprecated.
Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
timestamp
型の暗黙的なデフォルト値は非推奨とのことで、5.6.6 からの警告のようです。
以下、現象確認と対策についての記録です。
0. 前提条件
- Linux Mint 14 (64bit) での作業を想定しているが、OS・ディストリビューションは問わないはず。
- MySQL 5.6.11 での作業を想定。
1. 設定確認
MySQL サーバに root でログインし、以下のようにして explicit_defaults_for_timestamp
の値を確認する。
mysql> show variables like 'explicit_defaults_for_timestamp';
+---------------------------------+-------+
| Variable_name | Value |
+---------------------------------+-------+
| explicit_defaults_for_timestamp | OFF |
+---------------------------------+-------+
1 row in set (0.22 sec)
OFF
になっている。
timestamp
型に明示的にデフォルト値を設定しない(暗黙的なデフォルト値が設定される)ということ。
つまり、NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
が設定される。
今は OFF
に設定されているが、非推奨であるため、いずれ明示的にデフォルト値を設定しないといけくなる。
2. 動作確認
テスト用DB(予め test
を作成)で、timestamp
型のデフォルト値を指定せずにテーブルを作成してみる。
mysql> CREATE TABLE hoge ( upd_time timestamp ) ENGINE=InnoDB;
Query OK, 0 rows affected (0.57 sec)
mysql> show create table hoge;
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------+
| hoge | CREATE TABLE `hoge` (
`upd_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.16 sec)
暗黙的に NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
のデフォルト値が設定されている。
3. 設定ファイル編集
設定ファイル(my.cnf
)を以下のように編集する。
[mysqld]
explicit_defaults_for_timestamp = true
4. MySQL サーバ再起動
設定を有効化するため、MySQL サーバを再起動する。
$ sudo /etc/init.d/mysqld restart
ログにも警告メッセージも出力されなくなった。
5. 設定再確認
MySQL サーバに root でログインし、以下のようにして explicit_defaults_for_timestamp
の値を確認する。
mysql> show variables like 'explicit_defaults_for_timestamp';
+---------------------------------+-------+
| Variable_name | Value |
+---------------------------------+-------+
| explicit_defaults_for_timestamp | ON |
+---------------------------------+-------+
1 row in set (0.22 sec)
ON
になった。
明示的に timestamp
型にデフォルト値を設定しないといけないということ。
6. 動作再確認
まず、設定変更前と同じようにテーブルを作成してみる。
mysql> CREATE TABLE fuga ( upd_time timestamp ) ENGINE=InnoDB;
Query OK, 0 rows affected (1.30 sec)
mysql> show create table fuga;
+-------+-----------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+-----------------------------------------------------------------------------------------------------+
| fuga | CREATE TABLE `fuga` (
`upd_time` timestamp NULL DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+-----------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
timestamp
型のデフォルト値を明示的に指定していないので、NULL DEFAULT NULL
となっている。
次に、明示的に timestamp
型のデフォルト値を指定してテーブルを作成してみる。
mysql> CREATE TABLE hogefuga (
-> upd_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
-> ) ENGINE=InnoDB;
Query OK, 0 rows affected (5.97 sec)
mysql> show create table hogefuga;
+----------+------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+----------+------------------------------------------------------------------------------------------------------------------------------------------------------+
| hogefuga | CREATE TABLE `hogefuga` (
`upd_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+----------+------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.23 sec)
指定した通りのデフォルト値が設定された。
7. 参考サイト
慌てて対応しなくてもよいかも知れませんが、気になるなら対応しておいた方がよいでしょう。
以上。
Comments