MySQL の時間タイプとモードの詳細

MySQL の時間タイプとモードの詳細

MySQL データベースにタイムスタンプを挿入しようとすると、エラーが発生します。

mysql> Alarm_service の値に挿入します (6, '1970-01-01 08:00:00'); 
エラー 1292 (22007): 行 1 の列 'time' の日付時刻値が正しくありません: '1970-01-01 08:00:00'

# テーブル構造を表示します。mysql> show create table Alarm_service;
+---------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| テーブル | テーブルの作成 |
+---------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| アラームサービス | テーブル `アラームサービス` を作成します (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `time` タイムスタンプ NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP、
  主キー (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 デフォルト CHARSET=utf8 |
+---------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
セット内の 1 行 (0.00 秒)

エラー メッセージには時間値が間違っていることが示されていることがわかりますが、これは明らかに有効な時間ポイントです。

データを検索した結果、 MySQLではtimestamp型の有効な間隔が1970-01-01 00:00:01 - 2038-01-19 03:14:07 UTC,保存時に、挿入したデータはまず UTC 時間に変換されてから保存され、読み取り時にローカル時間に変換されます。私のタイムゾーンは East 8 なので、変換すると1970-01-01 00:00:00 UTCとなり、これは不正な時間になります。

解決策は次のとおりです。

  1. 時間を法定範囲内に調整する
  2. MySQLの厳密モードを調整して不正な時間を許可する

以下、関連する内容について詳しく説明します。

1. MySQL の時刻型

MySQL の時間型は 3 つのタイプに分けられます

  • DATE:日付のみ含まれ、時刻が含まれていない場合、MySQL は形式をYYYY-MM-DDに変換します。有効な範囲は1000-01-01 - 9999-12-31です。
  • DATETIME:日付 + 時刻を格納する場合、形式はYYYY-MM-DD HH:MM:SSとなり、有効な範囲は1000-01-01 00:00:00 - 9999-12-31 23:59:59なります。
  • TIMESTAMP:日付 + 時刻を格納する場合、形式はYYYY-MM-DD HH:MM:SSとなり、有効な範囲は1997-01-01 00:00:01 - 2038-01-19 03:14:07 UTCとなります。

同時に、 DATETIMETIMESTAMPも 6 桁のマイクロ秒データのサポートをサポートしており、形式はYYYY-MM-DD HH:MM:SS[.fraction] 、有効な範囲は.000000 - .999999です。

DATETIMETIMESTAMPどちらも、自動的に初期化され、現在の日付と時刻に更新されるデータも提供します。

TIMESTAMP型の場合、MySQL はデータ値を保存するときに UTC 標準時間に変換し、読み取るときに現在の時刻に変換します。タイムゾーンが変更されていない場合、値は保存した値のままです。タイムゾーンを変更すると、読み取る値も変更されます。この機能はDATETIMEでは動作しません。

2. タイムゾーンを確認する

mysql> '%zone%' のような変数を表示します。                                       
+------------------+--------+
| 変数名 | 値 |
+------------------+--------+
| システムタイムゾーン | CST |
| タイムゾーン | システム |
+------------------+--------+


現在のタイムゾーンは SYSTEM であり、これはオペレーティング システムと一致していることがわかります。システムのタイムゾーンは CST (中国標準時) です。また、システム時刻は East 8 (+0800) であることもわかります。

$ 日付 -R
2019年4月23日(火)11:22:47 +0800


したがって、 1970-01-01 08:00:00入力すると、 MySQLそれを1970-01-01 00:00:00,これは不正な値になります。

3. 不正な時間値

不正な時刻値の場合、MySQL はそれをさまざまな時刻タイプに適した値( 0000-00-00または0000-00-00 00:00:00に変換します。

たとえば、月が 1 月から 12 月の場合、 2019-13-01 00:00:00を挿入しようとすると、13 番目の月が存在しないため、不正な値である0000-00-00 00:00:00に修正されます。

4. 厳密モード

不正な時間値を挿入すると修正されますが、厳密モードではデータは挿入されず、代わりにエラーが報告されます。

エラー 1292 (22007): 行 1 の列 'time' の日付時刻値が正しくありません: '1970-01-01 08:00:00'


モードを設定することでMySQLの動作を調整できます。まず、MySQL モードを確認します。

mysql> '%sql_mode%' のような変数を表示します。            
+----------------------------+------------------------------------------+
| 変数名 | 値 |
+----------------------------+------------------------------------------+ |
| sql_mode | STRICT_TRANS_TABLES、NO_ENGINE_SUBSTITUTION |
+----------------------------+------------------------------------------+


このモードでは、不正な日付はエラーとして報告されます。モードをALLOW_INVALID_DATESに調整できます。

mysql> セッション sql_mode を 'ALLOW_INVALID_DATES' に設定します。
クエリは正常、影響を受けた行は 0 行 (0.00 秒)

mysql> '%sql_mode%' のような変数を表示します。            
+---------------+---------------------+
| 変数名 | 値 |
+---------------+---------------------+
| sql_mode | ALLOW_INVALID_DATES |
+---------------+---------------------+
セット内の 1 行 (0.00 秒)

このモードでは、日付の有効性は完全にはチェックされず、月が 1 ~ 12 の範囲内であることと、日が 1 ~ 31 の範囲内であることのみがチェックされます。これはユーザー入力を処理する場合に適していますが、このモードはDATEDATETIMEにのみ適しています。 TIMESTAMPの場合、有効な値が必要であり、そうでない場合は 0000-00-00 00:00:00 に修正されます。

不正な値の場合、このモードが有効になっているとエラーが報告されます。無効になっている場合は、 0000-00-00 00:00:00に修正され、警告が生成されます。

mysql> Alarm_service の値に挿入します (7, '1970-01-01 08:00:00'); 
クエリは正常、1 行が影響を受け、1 つの警告 (0.00 秒)

要約:

この問題には 2 つの解決策があります。

  1. 時間を法定範囲内に調整する
  2. MySQLの厳密モードを調整して不正な時間を許可する

5. 事件概要

ERROR 1067 (42000): Invalid default value for 'createTime'

理由を確認し、次のように設定されていることを確認します。

# テーブルを作成するためのステートメントを表示します CREATE TABLE `dimensionsConf` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `createTime` 日時 DEFAULT CURRENT_TIMESTAMP、
) ENGINE=InnoDB AUTO_INCREMENT=178 デフォルト CHARSET=utf8;

# データベースのバージョンを表示する $mysql --version
mysql Ver 14.14 Distrib 5.1.30、EditLine ラッパーを使用した unknown-linux-gnu (x86_64) 用

これで、MySQL の時間タイプとモードに関するこの記事は終了です。MySQL の時間タイプとモードの詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQL の時間タイプの選択
  • 時刻を保存するために適切な MySQL の datetime 型を選択する方法
  • MySQLストレージ時間タイプの選択に関する問題の説明
  • mysqlの時間タイプの選択について
  • MySql と Java の時間型の解析
  • MySQL の日付データ型と時刻型の使用法の概要

<<:  HTML での Li タグの使用例

>>:  ウェブは画像をクリックするとファイルをアップロードするウィンドウをポップアップするコードを実現します

推薦する

JSはキャンバス技術を使用してeChartsの棒グラフを模倣します

Canvas は HTML5 の新しいタグです。js を使用して Canvas 描画 API を操作...

jQueryはテーブルのシームレスなスクロールを実現します

この記事の例では、テーブルのシームレスなスクロールを実現するためのjQueryの具体的なコードを参考...

MySQL パフォーマンスの包括的な最適化方法リファレンス、CPU、ファイルシステムの選択から mysql.cnf パラメータの最適化まで

この記事では、一般的な MySQL 最適化方法をいくつかまとめて簡単に紹介します。これは、フルタイム...

CSS を使用して 3 列レイアウトを実装するサンプル コード。中央の列は適応型で、テキスト サイズに応じて幅が変わります。

Baiduのインタビューで遭遇する質問は、次のレイアウト効果を達成する必要がある。 中央の紫色の列...

ミニプログラムにより、製品属性の選択や仕様の選択が可能

この記事では、ミニプログラムで製品属性選択または仕様選択を実装するための具体的なコードを参考までに共...

nginx を最適化する 6 つの方法

1. Nginxの同時実行性を最適化する [root@proxy ~]# ab -n 2000 -c...

IE6/7 における a.getAttribute(href,2) 問題の分析と解決

簡単な説明<br />IE6および7では、一般的なaタグ(HTMLで記述され、DOM操作...

更新とデータ整合性処理のためのMySQLトランザクション選択の説明

MySQL のトランザクションはデフォルトで自動的にコミットされます (autocommit = 1...

MySQL マスタースレーブレプリケーションの詳細な分析

序文: MySQL では、マスター/スレーブ アーキテクチャが最も基本的かつ最も一般的に使用されるア...

モバイルデバイスで 1 ピクセルの境界線の問題を解決するいくつかの方法 (5 つの方法)

この記事では、モバイルデバイス上の 1 ピクセルの境界線の問題を解決する 5 つの方法を紹介します。...

Angular のパフォーマンス最適化: サードパーティ コンポーネントと遅延読み込みテクノロジー

目次概要環境の準備プロジェクトのパフォーマンスに影響を与える要因遅延読み込みとは何ですか?プロジェク...

js は、Element の入力コンポーネントのいくつかの機能を実装し、それをコンポーネントにカプセル化します (サンプルコード)

現在実装されているのは、基本的な使用方法、クリア可能なボックス、パスワードボックスです。参考リンク:...

CSS の Display、Visibility、Opacity、rgba、z-index: -1 の違い

ウェブページ上のいくつかの要素の非表示、透明、その他のプロパティを制御する必要があることがよくありま...

Reactイベントスロットリング効果が失敗する理由と解決策

目次ここでの問題は次の通りです:解決策1:解決策2: コンストラクタで初期化を割り当てる採掘場の概要...

CentOS 6 および 7 での MySQL 5.7 の詳細なインストール チュートリアル

開発には常にデータが必要です。サーバーとしての Linux では、テスト データを格納するためのデー...