ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
| この記事の要点 |
|
症状: 0000-00-00 00:00:00 と NULL は別物
MySQL 5.6 以前は DATETIME / DATE / TIMESTAMP の「未設定」を 0000-00-00 00:00:00 という擬似ゼロ値で表現していました。これはNULL ではないため、WHERE col IS NULL ではヒットしません。一方、PHP DateTime 等で読み出すと 「不正な日時」として扱われ NULL のように見える挙動になります。
-- 旧 MySQL の挙動
CREATE TABLE events (
id INT PRIMARY KEY AUTO_INCREMENT,
started_at DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00'
);
INSERT INTO events () VALUES ();
SELECT * FROM events;
-- id | started_at
-- 1 | 0000-00-00 00:00:00
SELECT * FROM events WHERE started_at IS NULL;
-- → 0 rows (NULL ではない)
SELECT * FROM events WHERE started_at = '0000-00-00 00:00:00';
-- → 1 row(これでヒット)
原因: sql_mode と PHP / Java 側の扱い
-- 現在の sql_mode を確認
SHOW VARIABLES LIKE 'sql_mode';
SELECT @@sql_mode;
-- MySQL 5.7+ のデフォルト例
-- ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,
-- NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
-- これが入っていると 0000-00-00 投入はエラー
INSERT INTO events (started_at) VALUES ('0000-00-00 00:00:00');
-- ERROR 1292 (22007): Incorrect datetime value: '0000-00-00 00:00:00'
PHP / Laravel 側の挙動:
// Laravel Eloquent でカラムに 0000-00-00 が入っていると...
$event = Event::find(1);
echo $event->started_at;
// InvalidArgumentException: Trailing data
// or
// Carbon\Exceptions\InvalidFormatException
// 対処: $casts で datetime 指定し、NULL 許容に
class Event extends Model {
protected $casts = ['started_at' => 'datetime'];
}
// PHP 生
$dt = new DateTime($row['started_at']); // 0000-00-00 → 例外
$dt = $row['started_at'] === '0000-00-00 00:00:00'
? null
: new DateTime($row['started_at']);
対処1: カラムを NULL 許容に変更
未設定状態を本来の NULL で表現するのが現代的な設計です。
-- カラムを NULL 許容に変更
ALTER TABLE events MODIFY started_at DATETIME NULL DEFAULT NULL;
-- 既存の 0000-00-00 を NULL に更新
UPDATE events SET started_at = NULL WHERE started_at = '0000-00-00 00:00:00';
-- 確認
SELECT * FROM events WHERE started_at IS NULL;
対処2: デフォルトを CURRENT_TIMESTAMP に
-- 作成時刻として常に「現在」を入れる
ALTER TABLE events
MODIFY started_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP;
-- 更新時にも自動更新
ALTER TABLE events
MODIFY updated_at DATETIME NOT NULL
DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;
対処3: sql_mode を整合させる
-- 一時的にゼロ日付を許容(移行作業中のみ)
SET SESSION sql_mode = REPLACE(
REPLACE(@@sql_mode, 'NO_ZERO_DATE', ''),
'NO_ZERO_IN_DATE', ''
);
-- 永続化(my.cnf)
-- [mysqld]
-- sql_mode = STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION
-- → NO_ZERO_DATE を外した状態(非推奨、移行中のみ)
-- 推奨は「sql_mode は厳格にしてアプリ側を NULL 対応へ修正」
対処4: 表示時の整形
-- 0000-00-00 を NULL として返す
SELECT
id,
CASE WHEN started_at = '0000-00-00 00:00:00' THEN NULL ELSE started_at END
AS started_at
FROM events;
-- DATE_FORMAT で表示用整形
SELECT
id,
IF(started_at = '0000-00-00 00:00:00', '未設定',
DATE_FORMAT(started_at, '%Y年%m月%d日 %H:%i')) AS started_label
FROM events;
Laravel 側の安全な書き方
// マイグレーション
Schema::create('events', function (Blueprint $t) {
$t->id();
$t->string('title');
$t->dateTime('started_at')->nullable(); // ✅ NULL 許容
$t->dateTime('ended_at')->nullable();
$t->timestamps(); // created_at / updated_at は自動
});
// モデル
class Event extends Model {
protected $casts = [
'started_at' => 'datetime',
'ended_at' => 'datetime',
];
public function isStarted(): bool {
return $this->started_at !== null
&& $this->started_at->isPast();
}
}
// 旧データの掃除(一度きり)
DB::statement("UPDATE events SET started_at = NULL WHERE started_at = '0000-00-00 00:00:00'");
DB::statement("UPDATE events SET ended_at = NULL WHERE ended_at = '0000-00-00 00:00:00'");
診断クエリ
-- スキーマ内の DATETIME / DATE / TIMESTAMP カラム一覧
SELECT table_name, column_name, data_type, is_nullable, column_default
FROM information_schema.columns
WHERE table_schema = DATABASE()
AND data_type IN ('datetime', 'date', 'timestamp')
ORDER BY table_name, ordinal_position;
-- 0000-00-00 を持つ行の検索(テーブルごとに)
SELECT COUNT(*) FROM events WHERE started_at = '0000-00-00 00:00:00';
-- 厳格化前のリハーサル
SELECT * FROM events
WHERE started_at = '0000-00-00 00:00:00' OR started_at IS NULL;
FAQ
Q: 「Invalid default value for 'created_at'」とマイグレーションで失敗
A: sql_mode に NO_ZERO_DATE が含まれた状態で DEFAULT '0000-00-00 00:00:00' を投入しようとしている。デフォルトを CURRENT_TIMESTAMP に変えるか、カラムを NULL DEFAULT NULL に。
Q: 既存システムが 0000-00-00 を前提にしている
A: 段階移行: ① まず NULL を扱える状態にする(NULL 許容 + アプリ修正)→ ② バッチで 0 を NULL に更新 → ③ 最後に sql_mode 厳格化。
Q: タイムゾーンも絡んで余計分からない
A: MySQL の TIMESTAMP は内部 UTC、DATETIME は文字列そのまま。アプリは UTC 統一が無難。SET time_zone = '+09:00' で接続セッションの TZ を変更可能。
ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
子ページはありません
- 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
- 1
- 1
- 1)
- 1
- 1
- 1
- 1
- 1
- 1
- 1
- 1
- 1
- 1
- 1
- 1
- 1"'`--
- 1
- 1
- 1
- 1
- 1
- 1
- 1
- 1
- 1
- 1)
- 1
- 1
- 1
- 1
- 1
- 1
- 1
- 1
- 1
- 1"'`--
- 1
- 1
- SQLSTATE[22007]: Invalid datetime format: 1366 Incorrect string value: ~
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript base URL 取得方法|window.location.origin と SSR/Node.js 対応
- 4 YouTube Data API v3 エラー一覧|403/400/404 の主要原因と切り分け
- 5 Spring Frameworkのアノテーション一覧
- 6 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 7 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- IT エンジニア職種ガイド(プログラマ / SE / インフラ / NW / DB / セキュリティ / クラウド / AI / フロント / バック / SRE) 2026-06-11 13:35:53
- Java String.length メソッド完全ガイド(文字数取得 / UTF-16 コードユニット単位 / 改行コードの取り扱い / 配列の length との違い / サロゲートペアと codePointCount) 2026-06-11 13:35:53
- Ethernet(イーサネット)完全ガイド(規格と速度 / フレーム構造 / MACアドレス / CSMA/CD / リンク層 / ケーブル種別 / 1000BASE-T / 10GbE) 2026-06-11 13:35:53
- Nginx で PHP を動かす設定(PHP-FPM インストール / fastcgi_pass / nginx.conf の location ~ \.php / FPM 起動 / 404 や白画面のトラブル対処) 2026-06-11 13:35:53
- Julia の Pkg REPL モード起動方法(] キーで切替 / 主要コマンド / 抜け方) 2026-06-11 13:35:53
- BIM とは何か(Building Information Modeling の概念 / 2D CAD との違い / LOD / 主要ソフトウェア Revit・ArchiCAD・Vectorworks / 導入メリットと運用上の注意点) 2026-06-11 13:35:53
- URL(Uniform Resource Locator)完全ガイド(構造 / スキーム / ドメイン / パス / クエリ / フラグメント / URI との違い / エンコード) 2026-06-11 13:35:53
- Xcodeエラー Could not locate device support files の原因と対処(DeviceSupport追加 / Xcodeアップデート / iOSバージョン整合 / Beta SDK) 2026-06-11 13:35:53
- Express で HTTP サーバーを起動する手順(最小構成 / ルーティング / app.listen / nodemon / よくあるエラー) 2026-06-11 13:35:53
- Apache mod_rewrite の RewriteEngine ディレクティブ完全ガイド(リダイレクト・URL書き換えを有効化 / .htaccess での記述例 / RewriteRule の基本 / よくあるエラー) 2026-06-11 13:35:53
- Java InputStream 完全ガイド(バイト入力ストリーム抽象クラス / read / FileInputStream / BufferedInputStream / try-with-resources / 文字列読み込み) 2026-06-11 13:35:53
- JavaScript よくある実装パターン集(DOM操作 / イベント / 配列処理 / 非同期 / フォーム検証 / localStorage / よく使う一行コード) 2026-06-11 13:35:53
- UE5 でアクターのサブレベル所属を変更する方法(レベルウィンドウから「選択アクタをレベルへ移動」/ Current Level 切替 / World Partition / 注意点 / 動的に変更したい場合) 2026-06-11 13:35:53
- EJSテンプレートの値表示と処理(<%= %> / <%- %> / <% %> / forループ / Node.js + http サーバ実装例 / エスケープと非エスケープの違い) 2026-06-11 13:35:53
- Javaの比較演算子完全ガイド(== / != / < / > / <= / >= / equals / compareTo / プリミティブと参照型の違い / よくある罠) 2026-06-11 13:35:53
コメントを削除してもよろしいでしょうか?