Mysql データベースの日付と日時型でデフォルト値 0000-00-00 を設定するときに発生するエラー問題の詳細な説明

Mysql データベースの日付と日時型でデフォルト値 0000-00-00 を設定するときに発生するエラー問題の詳細な説明

現象: MySQL バージョン 5.7 以降では、日付型と日付時刻型のデフォルト値が「0000-00-00」に設定され、例外が発生します: 'time' のデフォルト値が無効です

理由:コマンド ライン ウィンドウで現在の sql_mode 構成を確認します。

@@sql_mode を選択します。

結果は次のとおりです。

ONLY_FULL_GROUP_BY、STRICT_TRANS_TABLES、NO_ZERO_IN_DATE、NO_ZERO_DATE、
ERROR_FOR_DIVISION_BY_ZERO、NO_AUTO_CREATE_USER、および NO_ENGINE_SUBSTITUTION

2 つのオプション NO_ZERO_IN_DATE と NO_ZERO_DATE は、0000 などの日付と時刻を禁止します。したがって、mysql 構成ファイルで、sql_mode をリセットし、これら 2 つの項目を削除します。

解決

1. Windowsの場合:

SET [SESSION|GLOBAL] sql_mode='modes' を使用します。

注: SESSION (デフォルト オプション): 現在のセッションで有効であることを意味します。GLOBAL (再起動が必要): グローバルに有効であることを意味します。

my.ini設定ファイルを変更することもできます

***
デモ: 
    グローバル sql_mode を 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES, に設定 
    ERROR_FOR_DIVISION_BY_ZERO、NO_AUTO_CREATE_USER、NO_ENGINE_SUBSTITUTION' です

1. Linuxシステム:

my.cnfファイルを変更し、[mysqld]を追加します。

次のようにコードをコピーします
SQL モード = ONLY_FULL_GROUP_BY、STRICT_TRANS_TABLES、ERROR_FOR_DIVISION_BY_ZERO、NO_AUTO_CREATE_USER、NO_ENGINE_SUBSTITUTION

変更が完了したら、必ずMySQLを再起動してください。

2. Macシステム:

MacOS にはデフォルトで my.cnf ファイルはありません。MySQL をカスタマイズする必要がある場合は、/usr/local/mysql/support-files/ ディレクトリ内の任意の .cnf ファイルをコピーします。 my-default.cnf をコピーして別のディレクトリに配置しました。上記の変更が完了したら、名前を my.cnf に変更し、/etc ディレクトリにコピーして、mysql を再起動しました。

sql_mode モードの問題の拡張

sql_mode 共通値の説明

1.SQL構文サポートクラス

  • 完全グループ化のみ

GROUP BY 集計操作の場合、SELECT、HAVING、または ORDER BY 句の列が GROUP BY に表示されない場合は、SQL は無効です。これは、列クエリによるグループ化に含まれない列は矛盾するため、理解できます。 5.7 ではデフォルトで有効になっているため、5.6 から 5.7 へのアップグレードのプロセスに注意する必要があります。

  • ANSI_QUOTES

ANSI_QUOTES が有効になっている場合、二重引用符は ` と同じように識別子として解釈されるため、文字列を引用符で囲むことはできません。

設定後、 update t set f1="" ... を実行すると、「フィールド リストに不明な列 '' があります」などの構文エラーが報告されます。

  • パイプASCONCAT

|| を演算子ではなく文字列連結演算子として扱います。これは Oracle データベースと同じであり、文字列連結関数 CONCAT() に似ています。

  • テーブルオプションなし

SHOW CREATE TABLE は、ENGINE などの MySQL 固有の構文を出力しません。mysqldump を使用して DB タイプ間で移行する場合は、この点を考慮する必要があります。

  • いいえ

文字通り、ユーザーを自動的に作成するわけではありません。 MySQL ユーザーに権限を付与する場合、通常は GRANT ... ON ... TO dbuser を使用して同時にユーザーを作成します。このオプションを設定すると、Oracle の操作と同様になります。認証前にユ​​ーザーを作成する必要があります。これは 5.7.7 以降のデフォルトでもあります。

2. データ検査

  • 日付なし

日付「0000-00-00」は、次の厳密モードが設定されているかどうかに応じて、不正とみなされます。 1. 厳密モードが設定されている場合は、NO_ZERO_DATE が自然に満たされます。ただし、INSERT IGNORE または UPDATE IGNORE の場合は、「0000-00-00」は引き続き許可され、警告のみが表示されます。2. 非厳密モードで NO_ZERO_DATE が設定されている場合、効果は上記と同じで、「0000-00-00」は許可されますが、警告が表示されます。NO_ZERO_DATE が設定されていない場合は、警告は表示されず、完全に正当な値として扱われます。 3. NO_ZERO_IN_DATE は上記の状況と似ていますが、日付と曜日が 0 になるかどうか、つまり 2010-01-00 が有効かどうかを制御します。

  • エンジン代替なし

ALTER TABLE または CREATE TABLE で ENGINE を指定する場合、必要なストレージ エンジンが無効になっているかコンパイルされていない場合はどうすればよいですか? NO_ENGINE_SUBSTITUTION が有効になっている場合は、直接エラーがスローされます。この値が設定されていない場合、CREATE は代わりにデフォルトのストレージ エンジンを使用し、ATLER は変更を行わず、警告をスローします。

  • STRICT_TRANS_TABLES

これを設定すると厳密モードが有効になります。

なお、STRICT_TRANS_TABLES は複数の戦略の組み合わせではなく、INSERT および UPDATE で欠落または無効な値を処理する方法を指します。厳密モードでは、int に '' を渡すことは違法です。非厳密モードが有効になっている場合は 0 になり、警告が生成されます。
範囲外の場合、挿入の最大境界値になります

挿入される新しい行に、定義に明示的な DEFAULT 句がない非 NULL 列の値が含まれていない場合、値が欠落します。

MySQL 5.0 以降のバージョンでは、3 つの sql_mode モードがサポートされています: set @@sql_mode=xxx mode name;

よく設定される sql_mode は ANSI、STRICT_TRANS_TABLES、TRADITIONAL です。ANSI と TRADITIONAL は上記の組み合わせです。

3.ANSI モード: 緩いモードで、挿入されたデータをチェックします。定義されたタイプまたは長さを満たしていない場合は、保存する前にデータ型を調整するか切り捨て、警告を発します。

4.TRADITIONAL モード: 厳密モード。MySQL データベースにデータを挿入するときに、誤ったデータが挿入されないように厳密なデータ検証が実行され、エラーが報告されます。トランザクションに使用すると、トランザクションはロールバックされます。

3. STRICT_TRANS_TABLES モード: 厳密なモードでは、厳密なデータ検証が実行され、不正なデータは挿入できず、エラーが報告されます。

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Django でデフォルトのデータベースを mysql に変更する方法の例
  • データベースのデフォルトパスを変更した後にmysqlが起動できない問題の解決策
  • MySQLインストール後のデフォルトデータベースの役割の詳細な説明

<<:  Linux の grep コマンドと egrep コマンドの詳細な説明

>>:  JavaScript+html はフロントエンドページでランダム QR コード検証を実装します

推薦する

MySQLの高可用性と高パフォーマンスのクラスタを構築する方法

目次MySQL NDB Clusterとはクラスター構築のための準備作業クラスターのデプロイを開始す...

15行のCSSコードがAppleデバイスをクラッシュさせる可能性があり、最新のiOS 12も例外ではない

たった15行のCSSでiPhoneがクラッシュするWire のセキュリティ研究者 Sabri Had...

MySQL 5.7 のユニオンオール使用法のブラックテクノロジーを 5 分で学ぶ

MySQL 5.6 での union all のパフォーマンスパート 1:MySQL 5.6.25 ...

MySQL 8.0 再帰クエリの簡単な使用例

序文この記事では、MySQL 8.0 の新機能を使用して再帰クエリを実装します。詳細なサンプル コー...

MySQL 8.0.15 のインストールと設定のグラフィックチュートリアルと Linux でのパスワード変更

このブログは、MySQL8.0.15 を正常にインストールしたことを思い出すために書きました。以前は...

HTML+CSS+JS でスタックカルーセル効果を実装するサンプルコード

効果:スライドショーが一方向に動く場合、各画像のサイズ、位置、透明度、レベルを変更する必要があります...

React refの使用例

目次refとは何かrefの使い方DOM要素に配置するクラスコンポーネントに配置する関数コンポーネント...

React Router で履歴リダイレクトを使用する方法

react-routerでは、コンポーネント内のジャンプは<Link>で使用できます。し...

mysql-joinsの具体的な使用方法

目次結合構文: 1. InnerJOIN: (内部結合) 2. LeftJOIN: (左結合) 3....

シンプルなショッピングフォームを実装するJavaScript

この記事では、簡単なショッピングフォームを実装するためのJavaScriptの具体的なコードを参考ま...

Linux システムでログを手動でスクロールする方法

ログローテーションは、Linux システムでは非常に一般的な機能です。ログローテーションは、システム...

海外の無料写真素材サイトベスト9

良い画像素材のウェブサイトを見つけるのは難しいです。特に無料です。良い写真には非常に目を引く視覚効果...

条件によるMysqlカウントの複数の実装方法を詳細に解説

最近、あるウェブサイトのバックエンドに一連の統計機能を追加していたのですが、条件によるカウントが必要...

Springboot プロジェクトの Docker-compose イメージリリースプロセス分析

導入Docker-Compose プロジェクトは、Docker コンテナ クラスターの迅速なオーケス...

CSS3 で作成したホバーズーム効果

結果:実装コード: html <link href='https://fonts.go...