1. ホーム
  2. マイスル

[解決済み】MySQL 誤った日付時間値:'0000-00-00 00:00:00'

2022-04-10 20:22:53

質問

最近、10年前に作られた古いプロジェクトを引き継ぎました。このプロジェクトでは MySQL 5.1 を使用しています。

特に、デフォルトの文字セットを latin1 から utf8 に変更する必要があります。

例として、こんなテーブルがあります。

  CREATE TABLE `users` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
    `first_name` varchar(45) CHARACTER SET latin1 COLLATE latin1_general_ci DEFAULT NULL,
    `last_name` varchar(45) CHARACTER SET latin1 COLLATE latin1_general_ci DEFAULT NULL,
    `username` varchar(127) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL,
    `email` varchar(127) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL,
    `pass` varchar(20) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL,
    `active` char(1) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL DEFAULT 'Y',
    `created` datetime NOT NULL,
    `last_login` datetime DEFAULT NULL,
    `author` varchar(1) CHARACTER SET latin1 COLLATE latin1_general_ci DEFAULT 'N',
    `locked_at` datetime DEFAULT NULL,
    `created_at` datetime DEFAULT NULL,
    `updated_at` datetime DEFAULT NULL,
    `ripple_token` varchar(36) CHARACTER SET latin1 COLLATE latin1_general_ci DEFAULT NULL,
    `ripple_token_expires` datetime DEFAULT '2014-10-31 08:03:55',
    `authentication_token` varchar(255) CHARACTER SET latin1 COLLATE latin1_general_ci DEFAULT NULL,
    PRIMARY KEY (`id`),
    UNIQUE KEY `index_users_on_reset_password_token` (`reset_password_token`),
    UNIQUE KEY `index_users_on_confirmation_token` (`confirmation_token`),
    UNIQUE KEY `index_users_on_unlock_token` (`unlock_token`),
    KEY `users_active` (`active`),
    KEY `users_username` (`username`),
    KEY `index_users_on_email` (`email`)
  ) ENGINE=InnoDB AUTO_INCREMENT=1677 DEFAULT CHARSET=utf8 CHECKSUM=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC

自分のMacをセットアップして作業してみました。あまり深く考えずに "brew install mysql" を実行したら、MySQL 5.7 がインストールされました。というわけで、いくつかバージョンのコンフリクトが発生しています。

このデータベースのコピーをダウンロードし、インポートしました。

このようなクエリを実行しようとすると

  ALTER TABLE users MODIFY first_name varchar(45) CHARACTER SET utf8 COLLATE utf8_general_ci    NOT NULL  

こんなエラーが出ます。

  ERROR 1292 (22007): Incorrect datetime value: '0000-00-00 00:00:00' for column 'created' at row 1

で解決できると思っていたのですが。

  ALTER TABLE users MODIFY created datetime  NULL DEFAULT '1970-01-01 00:00:00';
  Query OK, 0 rows affected (0.06 sec)
  Records: 0  Duplicates: 0  Warnings: 0

が、出る。

  ALTER TABLE users MODIFY first_name varchar(45) CHARACTER SET utf8 COLLATE utf8_general_ci    NOT NULL ;
  ERROR 1292 (22007): Incorrect datetime value: '0000-00-00 00:00:00' for column 'created' at row 1

すべての値を更新しなければならないのでしょうか?

どのように解決するのですか?

テーブルが空であったり、あまり大きくない場合、私の提案は、作成文を.sqlファイルとしてエクスポートし、お望みのように書き換えてください。また、既存のデータがある場合も同様に、挿入文をエクスポートします(これは、作成文とは別のファイルにすることをお勧めします)。最後に、テーブルをドロップして、最初にcreate文、次にinsert文を実行します。

その際、以下のどちらかを使用することができます。 mysqldump コマンドを使用するか、または MySQL Workbench をインストールすることもできます。