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にパッケージ化する方法

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

推薦する

SQL Server 2019 Always On クラスターの Docker デプロイメントの実装

目次Docker デプロイメント Always on クラスターDockerをインストールする建築関...

MySQL の count()、group by、order by の詳細な説明

最近、IM を実行するときに、これらの 3 つのキーワードを同時に使用したときに問題が発生しました。...

Linux ネットワークプログラミング機能の簡単な分析

目次1.ソケットを作成する2. ソケットをバインドする3. 聞き手を作る。聞く4. 接続が受け入れら...

MySQL5.7+ MySQL Workbenchのインストールと設定方法のグラフィックチュートリアル(MAC)

この記事では、主にMACオペレーティングシステムでのMySQL5.7とMySQLWorkbenchの...

Centos7 esxi6.7 テンプレートの実際のアプリケーションの詳細な説明

1. Centos7.6システムを作成し、システムを最適化する1. NetworkManagerをオ...

略語マークと頭字語マーク

<abbr>タグと<acronym>タグは、Web ページに表示される略語と...

JS で if 判定をスムーズに行う方法

目次序文コードの実装アイデア 1アイデア2要約する参照ドキュメント序文プロジェクト内の小さな要件ポイ...

SSHパスワードフリーログイン設定方法の詳しい説明(画像とコマンド)

まず、私たちがやりたいことは、serverA の usera を使用して、パスワードなしで serv...

MySQL の char、varchar、text フィールド タイプの違い

MySQL では、char、varchar、text の各タイプのフィールドはすべて文字タイプのデー...

JS を使用してクリップボード内の Excel コンテンツを解析する方法

目次序文1. イベントとクリップボードを貼り付ける2. クリップボード内のコンテンツ形式3. HTM...

Nginx リバース プロキシ springboot jar パッケージ プロセス分析

Springboot プロジェクトをサーバーにデプロイする方法としては、war パッケージにパッケー...

JConsoler を使って Tomcat の JVM メモリを監視する方法を説明します

目次1. Tomcatを監視する方法2. Java独自の監視コマンド3. Tomcatのトラブルシュ...

Nginxドメイン名転送の実装

Nginx の紹介Nginx (「エンジン x」) は、ロシアのプログラマー Igor Sysoev...

要素フォーム検証で検証プロンプトをクリアする方法

目次問題のシナリオ:解決: 1. フィールドを個別にチェックする2. フォームフィールドの下のフィー...

2つのNode.jsプロセスがどのように通信するかの詳細な説明

目次序文異なるコンピュータ上の 2 つの Node.js プロセス間の通信TCPソケットの使用HTT...