SQL モード

TiDB サーバーはさまざまな SQL モードで動作し、クライアントごとに異なるモードでこれらのモードを適用します。SQL モードは、以下に示すように、TiDB がサポートする SQL 構文と実行するデータ検証チェックの種類を定義します。

TiDB を起動した後、 SET [ SESSION | GLOBAL ] sql_mode='modes'ステートメントを使用して SQL モードを設定できます。

  • SQL モードをGLOBALレベルに設定するときは、権限がSUPERあることを確認してください。このレベルでの設定は、その後に確立される接続にのみ影響します。

  • SESSIONレベルでの SQL モードの変更は、現在のクライアントにのみ影響します。

このステートメントでは、 modesカンマ (',') で区切られたモードのセットです。3 ステートメントを使用して、現在の SQL モードをSELECT @@sql_modeできます。SQL モードのデフォルト値: 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

  • ANSI : このモードは標準 SQL に準拠しています。このモードでは、データがチェックされます。データが定義されたタイプまたは長さに準拠していない場合、データ型が調整またはトリミングされ、 warningが返されます。
  • STRICT_TRANS_TABLES : 厳密モード。データが厳密にチェックされます。データに誤りがある場合は、テーブルに挿入できず、エラーが返されます。
  • TRADITIONAL : このモードでは、TiDB は「従来の」SQL データベース システムのように動作します。列に不正な値が挿入されると、警告ではなくエラーが返されます。その後、 INSERTまたはUPDATEステートメントは直ちに停止されます。

SQL モード テーブル

名前説明
PIPES_AS_CONCAT
ANSI_QUOTES"識別子として扱います。3 ANSI_QUOTES有効にすると、一重引用符のみが文字列リテラルとして扱われ、二重引用符は識別子として扱われます。したがって、二重引用符は文字列を引用するのに使用できません。(完全サポート)
IGNORE_SPACEこのモードを有効にすると、システムはスペースを無視します。たとえば、「user」と「user 」は同じです。(完全サポート)
ONLY_FULL_GROUP_BYSELECTHAVING 、またはORDER BY列を参照する SQL 文は、集計もGROUP BY句にも含まれていない場合は無効です。これは、クエリ結果にそのような列を表示することが異常であるためです。この設定は、 tidb_enable_new_only_full_group_by_checkシステム変数の影響を受けます。(フルサポート)
NO_UNSIGNED_SUBTRACTION減算時にオペランドに記号がない場合、結果をUNSIGNEDとしてマークしません。(完全サポート)
NO_DIR_IN_CREATEテーブルの作成時に、 INDEX DIRECTORYDATA DIRECTORYのすべてのディレクティブを無視します。このオプションは、セカンダリ レプリケーション サーバーにのみ有効です (構文サポートのみ)
NO_KEY_OPTIONSSHOW CREATE TABLEステートメントを使用すると、 ENGINEなどの MySQL 固有の構文はエクスポートされません。mysqldump を使用して DB タイプ間で移行する場合は、このオプションを検討してください。(構文サポートのみ)
NO_FIELD_OPTIONSSHOW CREATE TABLEステートメントを使用すると、 ENGINEなどの MySQL 固有の構文はエクスポートされません。mysqldump を使用して DB タイプ間で移行する場合は、このオプションを検討してください。(構文サポートのみ)
NO_TABLE_OPTIONSSHOW CREATE TABLEステートメントを使用すると、 ENGINEなどの MySQL 固有の構文はエクスポートされません。mysqldump を使用して DB タイプ間で移行する場合は、このオプションを検討してください。(構文サポートのみ)
NO_AUTO_VALUE_ON_ZEROこのモードを有効にすると、 AUTO_INCREMENT列に渡された値が0または特定の値の場合、システムはこの値を直接この列に書き込みます。5 NULL渡されると、システムは次のシリアル番号を自動的に生成します。(フルサポート)
NO_BACKSLASH_ESCAPESこのモードを有効にすると、 \バックスラッシュ記号はそれ自体のみを表します。(完全サポート)
STRICT_TRANS_TABLESトランザクションstorageエンジンの厳密モードを有効にし、不正な値が挿入された後にステートメント全体をロールバックします。(完全サポート)
STRICT_ALL_TABLESトランザクション テーブルの場合、不正な値が挿入された後にトランザクション ステートメント全体をロールバックします。(完全サポート)
NO_ZERO_IN_DATE厳密モードでは、月または日の部分が0の日付は受け入れられません。3 オプションを使用すると、TiDB は同様の日付として '0000-00-00' を挿入します。非厳密モードでは、この日付は受け入れIGNOREますが、警告が返されます。(完全サポート)
NO_ZERO_DATE厳密モードではIGNORE '0000-00-00' を有効な日付として使用しません。1 オプションを使用して、日付ゼロを挿入することはできます。非厳密モードでは、この日付は受け入れられますが、警告が返されます。(完全サポート)
ALLOW_INVALID_DATESこのモードでは、システムはすべての日付の有効性をチェックしません。 1から12までの月の値と1から31までの日付の値のみをチェックします。 このモードはDATEDATATIME列にのみ適用されます。 TIMESTAMP列すべてで完全な有効性チェックが必要です。 (完全サポート)
ERROR_FOR_DIVISION_BY_ZEROこのモードを有効にすると、データ変更操作 ( INSERTまたはUPDATE ) で0による除算を処理するときにエラーが返されます。
このモードが有効になっていない場合、システムは警告を返し、代わりにNULLが使用されます。(完全サポート)
NO_AUTO_CREATE_USER指定されたパスワードを除いて、 GRANT新しいユーザーを自動的に作成するのを防ぎます (完全サポート)
HIGH_NOT_PRECEDENCENOT 演算子の優先順位は、 NOT a BETWEEN b AND cなどの式がNOT (a BETWEEN b AND c)として解析されるというものです。MySQL の古いバージョンでは、この式は(NOT a) BETWEEN b AND cとして解析されます。(完全サポート)
NO_ENGINE_SUBSTITUTION必要なstorageエンジンが無効になっているかコンパイルされていない場合は、storageエンジンの自動置換を防止します。(構文サポートのみ)
PAD_CHAR_TO_FULL_LENGTHこのモードを有効にすると、システムはCHAR種類の末尾のスペースをトリミングしません。(構文サポートのみ。このモードはMySQL 8.0 では非推奨です。)
REAL_AS_FLOATREAL FLOATの同義語として扱い、 DOUBLEの同義語としては扱いません (完全サポート)
POSTGRESQLPIPES_AS_CONCAT ANSI_QUOTES相当NO_FIELD_OPTIONS NO_KEY_OPTIONS NO_TABLE_OPTIONS IGNORE_SPACE
MSSQLPIPES_AS_CONCAT ANSI_QUOTES相当NO_FIELD_OPTIONS NO_KEY_OPTIONS NO_TABLE_OPTIONS IGNORE_SPACE
DB2PIPES_AS_CONCAT ANSI_QUOTES相当NO_FIELD_OPTIONS NO_KEY_OPTIONS NO_TABLE_OPTIONS IGNORE_SPACE
MAXDBPIPES_AS_CONCAT ANSI_QUOTES NO_TABLE_OPTIONS NO_AUTO_CREATE_USER IGNORE_SPACE NO_FIELD_OPTIONS NO_KEY_OPTIONS
MySQL323NO_FIELD_OPTIONS HIGH_NOT_PRECEDENCE同等(構文サポートのみ)
MYSQL40NO_FIELD_OPTIONS HIGH_NOT_PRECEDENCE同等(構文サポートのみ)
ANSIREAL_AS_FLOAT PIPES_AS_CONCAT相当( ANSI_QUOTES IGNORE_SPACEのみ)
TRADITIONALSTRICT_TRANS_TABLES STRICT_ALL_TABLES相当NO_AUTO_CREATE_USER NO_ZERO_DATE ERROR_FOR_DIVISION_BY_ZERO NO_ZERO_IN_DATE
ORACLEPIPES_AS_CONCAT ANSI_QUOTES相当NO_AUTO_CREATE_USER NO_TABLE_OPTIONS NO_FIELD_OPTIONS IGNORE_SPACE NO_KEY_OPTIONS

このページは役に立ちましたか?