エラーメッセージはサーバーではなくMySQLクライアントから送信されているようです。したがって、サーバーの厳密モードを設定しても、このクライアントでこれらの日付を表示するのに役立ちません。
データに2012-09-31または2013-02-29スタイルの日付が含まれているようです。それらは正しくフォーマットされていますが、それ以外は間違っています。 MySQLの5.0.2より前のバージョンでは、これらはデータに正しく入り込むことができませんでした。これで、サーバーがALLOW_INVALID_DATES
に設定されました。 それらをギャグしていませんが、代わりに「0000-00-00」に変換しています。そして、クライアントはそれらをあざ笑っています。
これをクリーンアップするための最初のステップは、問題のある行を特定することです。これを試すことができます。
まず、ALLOW_INVALID_DATES
をオンにします
次に、このクエリを実行してテーブルを調べます。 SELECT *
は使用しないでください
SELECT col,col,col,DATE_FORMAT(datecol,'%Y-%m-%d')
FROM mytable
ORDER BY DATE_FORMAT(datecol,'%Y-%m-%d')
結果セットから、どの日付がガベージであるかを把握してください。それらはこのselectステートメントの最初に配置される可能性がありますが、それらを見つけるために少しいじくり回す必要があります。
次に、それらをどのように修正するかを考えます。行を削除しますか?日付を1941-12-07(悪名高い日付)に変更しますか?ここで何をする必要があるかはわかりません。
次に、それらを修正します。 1つか2つしかない場合は、1つずつ修正してください。
UPDATE mytable
SET datecol='whatever replacement date'
WHERE id='the id of the offending row.'
または
DELETE FROM mytable
WHERE id='the id of the offending row.'
それらが何千もある場合は、このようなもので一括修正できます。 ただし、最初にテストサーバーで問題を慎重に処理せずに、これを実行しないでください。間違えるとテーブルをゴミ箱に捨ててしまいます。
UPDATE mytable
SET datecol='whatever replacement date'
WHERE '0000-00-00' = DATE_FORMAT(datecol,'%Y-%m-%d')
問題の修正が終了したら、戻ってSELECT *
を実行します。 、すべてを確実に入手するため。
次に、ALLOW_INVALID_DATES
を無効にします 再度有効にすることはありません。
それは混乱をきれいにするはずです。実際のデータには、常に完全ではない行があることに注意してください。