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 コード検証を実装します

推薦する

Ubuntu インストール cuda10.1 ドライバ実装手順

1. cuda10.1をダウンロードします。 NVIDIA 公式ウェブサイト リンク: https:...

Docker を使って LEMP 環境を素早く構築する方法の例

LEMP(Linux + Nginx + MySQL + PHP)は、基本的に今日のWeb開発者にと...

Linuxのtimeコマンドの使い方の詳しい説明

1. コマンドの紹介時間は、コマンドの実行に費やされた時間や関連するシステム リソース、その他の情報...

LNMP と phpMyAdmin を Docker にデプロイする方法

環境準備:複数のコンテナに基づいてホストに lnmp をデプロイします。 nginx サービス: 1...

MySQL ディープページング問題の解決の実践記録

目次序文ディープページングを制限すると遅くなるのはなぜですか?サブクエリによる最適化B+ツリー構造の...

CSS スタイルを使用して表のフォントを垂直中央に配置する方法

CSS スタイルを使用して表内のフォントを垂直方向に中央揃えする方法は次のとおりです。下図のようなカ...

美しいHTMLコードの書き方

美しい HTML コードの外観 美しい HTML コードの書き方。外国人が書いた記事: 美しい HT...

ノード スキャフォールディングを使用してトークン検証を実装するサーバーを構築する方法

コンテンツスキャフォールディングを使用してノードプロジェクトを素早く構築するデータベースとやり取りす...

nginxフロー制御とアクセス制御の実装

nginx トラフィック制御レート制限は非常に便利ですが、Nginx では誤解され、誤って設定される...

Vue 親子コンポーネントの相互値の転送と呼び出し

目次1. 親が子コンポーネントに値を渡す2. 子コンポーネントが親コンポーネントに値を渡す3. 子コ...

MySQLの挿入文字化け問題を解決する方法

問題の説明: MySQL に中国語の文字を挿入する場合、または MySQL では中国語の文字が正常に...

ffmpeg 中国語パラメータの詳細な説明

FFMPEG 3.4.1 バージョンパラメータの詳細使用方法: ffmpeg [オプション] [[入...

Vue3はCSSの無限シームレススクロール効果を実装します

この記事では、CSS無限シームレススクロール効果を実現するためのvue3の具体的なコードを参考までに...

Dockerにおけるコンテナとイメージの違いについてお話ししましょう

鏡とは何ですか?イメージは、複数のイメージ レイヤー (UnionFS および AUFS ファイル ...