| この記事の要点 |
|
エラー内容
[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/ 配下 |
| Windows | MySQL のデータディレクトリ等にある 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 で現在の値を確認してから判断してください。
関連
- MySQL/MariaDB 初期設定 (my.cnf) 完全ガイド
- MySQL の現在設定を確認するコマンド一覧(SHOW VARIABLES / STATUS / INNODB STATUS)
- MySQLの起動、停止、再起動(CentOS, Ubuntu)
- MySQL バージョン確認方法完全ガイド
- ALTER TABLE カラム定義変更完全ガイド (MySQL/PG/Online DDL)
子ページはありません
- 1071 Specified key was too long; max key length is 767 bytes
- ERROR 1063 (42000): Incorrect column specifier for column '~'
- mysqld: Can't change dir to '...\MySQL\MySQL Server X.X\data\' (OS errno 2 - No such file or directory)
- Install/Remove of the Service Denied!
- Datetime 型が NULL に見える
- Warning: World-writable config file '/etc/mysql/my.cnf' is ignored
- ERROR 1698 (28000): Access denied for user 'root'@'localhost'
- Exception: Wrong MySQL configuration
- [Warning] TIMESTAMP with implicit DEFAULT value is deprecated.
- ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
- ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
- Incorrect column specifier for column 'カラム名'
- BLOB/TEXT column 'description' used in key specification without a key length
- ERROR: /bin/sh: mysql_config: コマンドが見つかりません
- Host '...' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'
- CSVエクスポート時に「ERROR 1045 (28000): Access denied for user 'username'@'localhost'」エラーが表示される
- Cannot execute statement: impossible to write to binary log since BINLOG_FORMAT = STATEMENT
- SQLSTATE[22007]: Invalid datetime format: 1366 Incorrect string value: ~
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- プロジェクトをTomcatプロジェクトとして認識させる方法 2026-10-07 22:32:50
- MySQLの1366 Incorrect string value|Laravelの文字コード・絵文字エラー 2026-10-07 21:54:03
- curlの証明書ホスト名不一致|旧エラー51・現行60の確認と対処 2026-10-07 21:54:03
- LaravelのMassAssignmentException|fillableの原因と安全な対処 2026-10-07 21:54:03
- Eclipse で Tomcat の起動ログがコンソールに出ない時の確認手順 2026-10-07 21:54:02
- MySQLにおける中央値(Median)の導き方(バージョン8未満) 2026-10-07 13:49:45
- getInputForward 2026-10-07 13:41:15
- JSONから配列に変換 2026-10-07 13:41:15
- ビューから値をモデルに格納しコントローラーで受け取る方法 2026-10-07 13:23:41
- Laravelのテーブル作成と定義変更|マイグレーション・up/down・注意点 2026-10-07 13:23:41
- NumPy 配列に要素を追加する方法 (append / concatenate) 2026-10-07 13:23:41
- MariaDB・MySQLで現在日時を取得する方法|NOW・タイムゾーン・保存型 2026-10-07 13:13:36
- 【django】テンプレートで定数を使用する方法 2026-10-07 13:10:15
- Spring BootにおけるApplication.propertiesの環境依存設定の分割方法 2026-10-07 12:09:35
- Not supported for DML operations【Springエラー】 2026-10-07 11:09:38