おはようございます。 Mysql 5.7.25:
insert into mytable values('2019-03-31 02:06:29')
エラー「#1292不正な日時値」を返す
だが:
insert into mytable values('2019-03-31 03:06:29')
エラーを返しません。 (フィールドのタイプはタイムスタンプです)
どこが間違っているのですか?
ありがとう
チコ
これによりエラーが発生する場合:
insert into mytable values('2019-03-31 02:06:29')
しかし、これはしません:
insert into mytable values('2019-03-31 03:06:29')
あなたはEUのようなタイムゾーン、特にCETを使用している可能性があります(データベースでtzを使用せず、UTCを使用することを強くお勧めします。簡単です)。 EU(およびその他の国)は、夏時間調整のために日曜日の午前2時から午前3時までに時計を変更したため、そのようなTZを使用している場合は不可能です。 、 '2019-03-31 02:XX:XX'データを挿入します。そのようなデータはそのタイムゾーンでは無効です。
行う:
SELECT @@time_zone;
使用しているタイムゾーンを知るため。 SYSTEMと表示されている場合は、OSで確認してください。
修正:それを挿入しないでください。その時刻は存在しませんでした。2の前または3の後に発生しました。または、データベースのタイムゾーンを修正するか、挿入しようとしているものと一致するos。
適切な修正:データベースのタイムゾーンを処理しないでください( 決して、自分で実装しようとしないでください )、それを実行してくださいプレゼンテーション時にのみ、アプリケーションバックエンドにUTCを使用します。サーバーもUTCを使用するように設定します。
タイムゾーンの異なるDBからMysql Dumpをインポートすると、同様の問題が発生しました。その列は、デフォルト値としてCURRENT_TIMESTAMPを使用するTIMESTAMPでした。
SELECT @@time_zone
両方のサーバーがタイムゾーンとしてSYSTEMを使用していることがわかりました。しかし、ターミナルでdate
と入力すると、1つのサーバーがUTCを使用し、もう1つのサーバーがAESTを使用していることがわかりました。
インポートセッションと同じタイムゾーンを設定できることに気づきました。
SET time_zone='+00:00'
して、インポートを実行します。
または、mysqlのグローバルタイムゾーンを設定して、将来(mysqlを再起動するまで)気にする必要はありません。
SET @@global.time_zone='+00:00'
Initステートメントを設定するか、ドキュメントに記載されているように、またはMAMPを使用している場合は別の方法で、さまざまな方法でそれを行うことができます。これを行うための適切な方法については、 this answer を確認してください。