MySQL sql_mode の使用に関する詳細な説明

MySQL sql_mode の使用に関する詳細な説明

序文

前回の記事「MySQL の事例: データ損失の悲劇」を読んだ方は、sql_mode が非常に重要な設定であることに気付いたと思います。次に、この設定項目について詳しく分析します。

sql_mode の説明

sql_modeはSQL構文のサポートとデータの検証に直接影響します。これには多くのオプションがあり、バージョン5.7のデフォルト値は次のとおりです。

「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」

一般的に、変更することは推奨されません。

最も重要なオプション

sql_mode の最も重要なオプションは次の 3 つです。

(1) ANSI: このオプションはSQL構文のサポートを決定します。ANSIに設定すると、標準SQL構文にさらに準拠するようになります。

(2) STRICT_TRANS_TABLES: このオプションはデータの検証を決定します。トランザクションストレージエンジンの場合、不正な値が現れるとトランザクションは失敗し、ロールバックします。非トランザクションストレージエンジンの場合、不正な値が最初の行に現れた場合、トランザクションは失敗します。不正な値が途中で現れた場合、不正な値は調整され、アラームがスローされます。

(3)従来型:このオプションは、従来のリレーショナルデータベースと一貫したパフォーマンスを決定します。一部の異常な操作については、警告プロンプトの代わりに失敗エラーが直接報告されます。

すべてのオプション

sql_mode には次のオプションも含まれます。

(4)ALLOW_INVALID_DATES:このオプションは、厳密な日付検証を実行しないことを決定します。月の範囲が1〜12、日の範囲が1〜31であるかどうかのみを検証し、特定の日付が有効かどうかは検証しません。たとえば、不正な日付2020-04-31は許可されます。

(5)ANSI_QUOTES:このオプションは引用符文字を決定します。これにより、二重引用符 " をバッククォート ` と同様に引用符文字として使用できるようになります。

(6) ERROR_FOR_DIVISION_BY_ZERO: このオプションは、ゼロ除算の戻り値を決定します。有効になっていない場合、ゼロ除算の戻り値は null となり、警告は生成されません。有効になっていても非厳密モードの場合、ゼロ除算の戻り値は null となり、警告が生成されます。有効になっていて厳密モードの場合、ゼロ除算はエラーになります。

(7) HIGH_NOT_PRECEDENCE: このオプションは、否定演算の優先順位を決定します。有効にすると、NOT a BETWEEN b AND c は NOT (a BETWEEN b AND c) として解析されます。古いバージョンでは、NOT a BETWEEN b AND c は (NOT a) BETWEEN b AND c として解析されます。

(8) IGNORE_SPACE: このオプションは、関数名と括弧の間のスペースを無視するかどうかを決定します。有効にすると、count(*)はエラーを報告しません。

(9) NO_AUTO_CREATE_USER: このオプションは、grant文​​がユーザーを自動的に作成しないことを決定します。これは非推奨であり、grant文​​はユーザーを作成しません。

(10) NO_AUTO_VALUE_ON_ZERO: このオプションは、自動インクリメント列の生成を決定します。一般的に、自動インクリメント列に 0 または null を挿入すると、システムによって次の自動インクリメント列が自動的に生成されます。有効にすると、自動インクリメント列に 0 を挿入すると元の値 0 が保持され、null を挿入すると次の自動インクリメント列が自動的に生成されます。

(11) NO_BACKSLASH_ESCAPES: このオプションはバックスラッシュ\の効果を決定します。有効にすると、バックスラッシュ\はエスケープ文字としてではなく、通常の文字として使用されます。

(12)NO_DIR_IN_CREATE:このオプションは、テーブルを作成するときにすべてのINDEX DIRECTORYおよびDATA DIRECTORY命令を無視するかどうかを決定します。このオプションはスレーブデータベースでのみ有効です。

(13)NO_ENGINE_SUBSTITUTION:このオプションは、テーブルの作成時に存在しない/サポートされていないストレージエンジンが指定されているかどうかを決定し、デフォルトのストレージエンジンに自動的に変換します。

(14) NO_FIELD_OPTIONS: 非推奨。

(15)NO_KEY_OPTIONS:非推奨。

(16)NO_TABLE_OPTIONS:非推奨。

(17) NO_UNSIGNED_SUBTRACTION: 通常、整数(一方が符号なし)を減算すると、結果は符号なしとなり、結果が負の数になるとエラーが報告されます。このオプションを有効にすると、負の数を正常に処理できます。

(18) NO_ZERO_DATE: このオプションは、「0000-00-00」を挿入できるかどうかを決定します。有効になっていない場合、「0000-00-00」は警告なしで挿入できます。有効になっているが非厳密モードの場合、「0000-00-00」を挿入できますが警告が生成されます。有効になっていて非厳密モードの場合、「0000-00-00」は挿入できず、エラーが直接報告されます。

(19) NO_ZERO_IN_DATE: このオプションは、月と日を 00 にできるかどうかを決定します。有効になっていない場合、月と日を 00 にすることができ、警告は生成されません。有効になっているが非厳密モードの場合、月と日を 00 にすることができますが、警告が生成されます。有効になっていて非厳密モードの場合、月と日を 00 にできない場合はエラーが報告されます。

(20)ONLY_FULL_GROUP_BY:このオプションは、select/having/order byに続く非集計フィールドを決定し、group by句に出現する必要があります。

(21) PAD_CHAR_TO_FULL_LENGTH: 通常、char型フィールドを照会する場合、末尾の空データは切り捨てられます。このオプションを有効にすると、char型フィールドを照会する場合、末尾の空データは切り捨てられなくなります。

(22)PIPES_AS_CONCAT:このオプションは、||記号をORの同義語としてではなく、文字列連結演算子として扱うかどうかを決定します。

(23)REAL_AS_FLOAT:このオプションは、REALをDOUBLEの同義語ではなくFLOATの同義語として扱うかどうかを決定します。

(24) STRICT_ALL_TABLES: このオプションはデータの検証を決定します。トランザクションストレージエンジンの場合、不正な値が現れると、トランザクションは失敗し、ロールバックします。非トランザクションストレージエンジンの場合、不正な値が最初の行に現れた場合、トランザクションは失敗します。不正な値が途中で現れた場合、前の操作は成功し、後続の操作は直接エラーを報告し、トランザクションは部分的に成功し、部分的に失敗します。

要約する

上記の学習を通じて、sql_mode のさまざまなオプションについて、より詳細に理解していただけたと思います。sql_mode の設定方法については、私の個人的な提案は次のとおりです。

(1)バージョン5.5/5.6の場合、sql_modeをデフォルト値5.7に設定することをお勧めします。

(2)バージョン5.7の場合は、sql_modeのデフォルト値を維持します。

(3)バージョン8.0ではsql_modeもデフォルト値のままにすることができます。

sql_mode 設定により、MySQL はさまざまなモードで非常に柔軟に実行できますが、さまざまなリスクも伴います。MySQL はさまざまな重要なシステムに広く使用されているため、sql_mode の設定を厳密に見直し、開発コードの管理を標準化することをお勧めします。実際、これは公式のデフォルト値からもわかります。MySQL のバージョンが繰り返されるにつれて、sql_mode 設定はますます厳格になっています。

上記はMySQL sql_modeの使い方の詳しい説明の内容です。MySQL sql_modeの使い方についてもっと知りたい方は、123WORDPRESS.COMの他の関連記事もぜひご覧ください!

以下もご興味があるかもしれません:
  • MySQL sql_mode の変更が有効にならない理由と解決策
  • MySQL sql_modeクエリと設定の詳細な説明
  • MySQL での SQL モードの表示と設定の詳細な説明
  • MySQL の sql_mode モード例の詳細な説明
  • Django2 は MySQL に接続し、モデルテストの例を分析します。
  • MySQL sql_modeの適切な設定に関する詳細な説明
  • MySQL sql_mode の分析と設定の説明
  • MySQL 5.7 の sql_mode のデフォルト値によって生じる落とし穴と解決策
  • MySql バージョンの問題に対する完璧なソリューション sql_mode=only_full_group_by
  • MySQL 5.7.9 バージョンの sql_mode=only_full_group_by 問題を解決する
  • MySQL での SQL モードの使用法の詳細な説明
  • mysql sql_mode="" 関数の説明

<<:  アイデアを通じてプロジェクトをDockerにパッケージ化する方法

>>:  ウェブデザインには目的、アイデア、思考、そして粘り強さがなければならない

推薦する

BT Baota Panel php7.3 および php7.4 が ZipArchive をサポートしない問題の解決方法

Baota PanelのPHP7.3バージョンがZipArchiveをサポートしていないため、プログ...

Nodejs のグローバル変数とグローバルオブジェクトの知識ポイントと使用方法の詳細

1. グローバルオブジェクトすべてのモジュールは呼び出すことができます1) global: ブラウザ...

Vue3.0 で Vuex 状態管理を開始する方法をすぐに習得します

Vuex は、Vue.js アプリケーション専用に開発された状態管理パターンです。集中型ストレージを...

nginx + fastcgi を使用して画像認識サーバーを実装する

背景ディープラーニング モデルの推論には、特定のデバイスが使用されます。マシンは、モデルの読み込み、...

Linux 負荷分散 LVS の詳細な理解

目次1. LVS 負荷分散2. 負荷分散LVSの基本紹介3. LVSアーキテクチャ3.1 ロードバラ...

React.FCとReact.Componentの使用に関する簡単な説明

目次1. React.FC<> 2. クラスxxはReact.Componentを拡張し...

Nginx ストリーム構成プロキシ (Nginx TCP/UDP ロード バランシング)

序章nginx が優れたリバース プロキシ サービスであることは誰もが知っています。nginx を使...

Linux 上の Nginx に複数のバージョンの PHP をインストールする

サーバーの LNPM 環境をインストールして構成する場合、複数のバージョンの PHP の共存を考慮す...

MySQL クロステーブルクエリとクロステーブル更新

SQL の基礎知識がある友人は、「クロステーブル クエリ」について聞いたことがあるはずですが、クロス...

シンプルなカレンダー効果を実現する JavaScript コード

この記事では、シンプルなカレンダー効果を実現するためのJavaScriptの具体的なコードを参考まで...

CentOS7 は rpm パッケージを使用して mysql 5.7.18 をインストールします

例示するこの記事は、2017 年 5 月 20 日に MySQL-5.7.18 を使用して作成されま...

jsは双方向データバインディング(アクセサ監視)を実現します

この記事の例では、双方向データバインディングを実現するためのjsの具体的なコードを参考までに共有して...

Springboot+Vue-Cropperでアバターの切り取りとアップロードの効果を実現

アバターをアップロードするにはVue-Cropperコンポーネントを使用します。参考までに具体的な内...

HTML 基本構造_Powernode Java アカデミー

多くの場合、Web ページ開発を学ぶときに最初に印象に残るのは、html または htm サフィック...

シンプルなログインページを実装するための HTML+jQuery

目次導入公開コード(バックエンドインターフェース)例 1: 最もシンプル (純粋な HTML)コード...