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

推薦する

ページコードの変更の効率を向上させ、HTML言語のコア知識を習得します。

ウェブサイトを構築するとき、HTML 言語は重要ではないと思われるかもしれませんが、実際には、基本的...

jQuery キャンバスは QR コード付きのポスターを生成します

この記事では、jQuery キャンバスを使用して QR コード付きのポスターを生成するための具体的な...

ページ内にマーキーとフラッシュが共存する場合の競合解決

競合の主な症状は、FLASH ボタンがジャンプし続け、不安定になり、Web ページの外観と通常のアク...

選択/フォーカス時にすべてのオプションをリストする現在のより良い方法

開発中にこのような要件に遭遇したので、将来使用するために記録しました。需要背景キーボード ショートカ...

mysqlはタイムゾーン関連の問題を解決します

序文: MySQL を使用すると、時間の表示が正しくない、タイムゾーンが GMT+8 ゾーンにない、...

Nginx プロキシを使用してフロントエンドのクロスドメイン問題を解決する方法

序文Nginx (「エンジン エックス」と発音) は、リバース プロキシ、ロード バランサ、HTTP...

MySQL 学習: データベース テーブルの 5 つの主要な制約を初心者向けに詳しく説明します

目次1. 制約の概念と分類2. 5つの制約の追加と削除2.1 制約を追加する6つの方法2.2 制約を...

RedHat 6.5 に MySQL 5.7 をインストールするための詳細なチュートリアル

RedHat6.5インストールMySQL5.7チュートリアル共有、参考までに、具体的な内容は次のとお...

jQueryはネストされたタブ機能を実装します

この記事では、ネストされたタブ機能を実装するためのjQueryの具体的なコードを参考までに紹介します...

Vue ソング プログレス バーのサンプル コード

なお、これはvue-cliで作成したプロジェクトではありません。vue.jsを参照して記述したHTM...

HTTPSの最も優れた説明

皆さんおはようございます。しばらく記事を更新していませんでした。実は、私は流行中に1か月以上家にいて...

MySQL のソートとページング (order by と limit) と既存の落とし穴

並べ替えクエリ (order by)電子商取引の場合: 今日完了したすべての注文を表示し、取引金額に...

Python3.6-MySql 挿入ファイルパス、バックスラッシュをなくす解決策

以下のように表示されます。上記のように、置き換えるだけです。 Python3.6-MySql でファ...

vue+el-element でファイル名に応じてダイアログを動的に作成する実践

目次背景成し遂げる1. カプセル化された /utils/dialogControl.js 2.ダイア...

MySQLカスケードレプリケーションの実装方法の例

いわゆるカスケード レプリケーションでは、マスター サーバーが 1 つのスレーブ サーバーにのみデー...