◀ 9.

[Warning] TIMESTAMP with implicit DEFAULT value is deprecated.

▶
この記事の要点
  • MySQL 5.6 / 5.7 の起動時にエラーログへ出る警告で、起動自体は成功している
  • 原因はサーバー変数 explicit_defaults_for_timestamp が OFF(5.6・5.7 の既定値)で、TIMESTAMP 列に暗黙の既定値を付ける旧仕様が有効なこと
  • 設定ファイルの [mysqld] に explicit_defaults_for_timestamp = 1 を書いて再起動すると消える
  • ON にすると TIMESTAMP 列の自動設定がなくなるため、必要な列には DEFAULT CURRENT_TIMESTAMP を明示する
  • MySQL 8.0 では既定値が ON になっており、この警告は通常出ない

エラー内容

[Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).

「暗黙の DEFAULT 値を持つ TIMESTAMP は非推奨です。--explicit_defaults_for_timestamp サーバーオプションを使ってください」という意味です。MySQL 5.6 以降の mysqld 起動時に、エラーログ(/var/log/mysqld.log など)や systemctl status mysqld の出力に表示されます。

発生条件と原因

MySQL には、TIMESTAMP 型の列について標準 SQL とは異なる古い独自の動作があります。explicit_defaults_for_timestamp が OFF の場合、テーブル作成時に次のような設定が暗黙に付きます。

  • テーブルの最初の TIMESTAMP 列に DEFAULT や ON UPDATE を書かないと、自動的に DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP が付く
  • NULL を明示的に許可していない TIMESTAMP 列は自動的に NOT NULL になる
  • 2 つ目以降の TIMESTAMP 列には '0000-00-00 00:00:00' が既定値として付く
  • NOT NULL の TIMESTAMP 列に NULL を INSERT すると、エラーではなく現在時刻が入る

MySQL 5.6.6 でこの動作は非推奨になり、標準的な動作に切り替える explicit_defaults_for_timestamp が追加されました。ただし互換性のため 5.6・5.7 の既定値は OFF のままなので、何も設定しないと起動のたびに「旧仕様のまま動いています」という警告が出ます。MySQL 8.0 では既定値が ON に変わりました。

対処法

1. 設定ファイルに追記する

my.cnf の [mysqld] セクションに次の 1 行を追加します。設定ファイルの場所は環境によって異なります。

環境主な場所
CentOS / RHEL 系/etc/my.cnf
Ubuntu / Debian(MySQL 公式パッケージ)/etc/mysql/mysql.conf.d/mysqld.cnf など /etc/mysql/ 配下
WindowsMySQL のデータディレクトリ等にある my.ini
[mysqld]
explicit_defaults_for_timestamp = 1

2. MySQL を再起動する

# CentOS 7 以降 / Ubuntu など systemd の環境(サービス名は mysqld または mysql)
sudo systemctl restart mysqld

再起動後にエラーログを確認し、警告が出なくなっていれば完了です。

設定を変える前の注意点

この設定は警告を消すだけでなく、TIMESTAMP 列の動作そのものを変えます。既存のアプリケーションへの影響を確認してから適用してください。

  • 既存テーブルの定義はそのまま: 作成済みのテーブルには、作成時に付いた DEFAULT や ON UPDATE がすでに保存されているため、設定を変えても定義は変わりません。影響を受けるのは主に、これから作る(作り直す)テーブルです
  • NULL の INSERT がエラーになる: NOT NULL の TIMESTAMP 列に NULL を入れて「現在時刻を入れてもらう」書き方をしているアプリは、ON にすると現在時刻が自動では入らなくなり、通常は「Column cannot be null」などのエラーになります
  • 新規テーブルでは既定値を明示する: 作成日時・更新日時の列は、次のように明示的に書きます
CREATE TABLE article (
  id         INT PRIMARY KEY AUTO_INCREMENT,
  title      VARCHAR(200) NOT NULL,
  created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

このように明示しておけば、explicit_defaults_for_timestamp が ON でも OFF でも同じ動作になり、MySQL 8.0 への移行時にも困りません。

確認方法

-- 現在の設定値(ON なら 1)
SHOW VARIABLES LIKE 'explicit_defaults_for_timestamp';

-- テーブルに実際に付いている既定値を確認
SHOW CREATE TABLE article;

SHOW CREATE TABLE の結果に DEFAULT CURRENT_TIMESTAMP などが表示されていれば、その列の既定値は保存済みです。

よくある質問

警告を無視しても動作に問題はない?

警告なので、MySQL 5.6・5.7 で使い続ける限りは動作に影響しません。ただし旧仕様に依存したままだと、MySQL 8.0 へ移行したときに挙動が変わります。早めに設定を ON にし、テーブル定義で既定値を明示しておくのが安全です。

MariaDB でも同じ設定がある?

MariaDB にも同名の変数がありますが、既定値はバージョンによって異なります。SHOW VARIABLES で現在の値を確認してから判断してください。

関連

Post Share
子ページ

子ページはありません

同階層のページ
  1. 1071 Specified key was too long; max key length is 767 bytes
  2. ERROR 1063 (42000): Incorrect column specifier for column '~'
  3. mysqld: Can't change dir to '...\MySQL\MySQL Server X.X\data\' (OS errno 2 - No such file or directory)
  4. Install/Remove of the Service Denied!
  5. Datetime 型が NULL に見える
  6. Warning: World-writable config file '/etc/mysql/my.cnf' is ignored
  7. ERROR 1698 (28000): Access denied for user 'root'@'localhost'
  8. Exception: Wrong MySQL configuration
  9. [Warning] TIMESTAMP with implicit DEFAULT value is deprecated.
  10. ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
  11. ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
  12. Incorrect column specifier for column 'カラム名'
  13. BLOB/TEXT column 'description' used in key specification without a key length
  14. ERROR: /bin/sh: mysql_config: コマンドが見つかりません
  15. Host '...' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'
  16. CSVエクスポート時に「ERROR 1045 (28000): Access denied for user 'username'@'localhost'」エラーが表示される
  17. Cannot execute statement: impossible to write to binary log since BINLOG_FORMAT = STATEMENT
  18. SQLSTATE[22007]: Invalid datetime format: 1366 Incorrect string value: ~