フィールド | バージョン | 説明 |
ALLOW_INVALID_DATES | MySQL 5.6、MySQL 5.7、および MySQL 8.0 でサポートされています | 日付形式に準拠していない無効な日付値の挿入または更新を許可します。 デフォルトの厳密な SQL モードでは、MySQL は日付値が YYYY-MM-DD などの指定された形式に準拠している必要があります。 挿入または更新する日付値の形式が無効な場合、MySQL は操作を拒否し、エラーを報告します。 sql_mode パラメータを ALLOW_INVALID_DATES に設定すると、MySQL は日付形式に準拠していない無効な日付値の挿入または更新を許可し、エラーを報告しません。
説明 このモードは、DATE 列と DATETIME 列に適しています。 TIMESTAMP 列には有効な日付が必要なため、TIMESTAMP 列には使用できません。 例: birthday という名前の日付フィールドがあるとします。 厳密な SQL モードでは、YYYY-MM-DD 形式の値のみが許可されます。 他の形式の値を挿入すると、エラーが報告されます。 sql_mode パラメータを ALLOW_INVALID_DATES に設定すると、フィールドに 2022-13-45 などの無効な日付値を挿入でき、MySQL は挿入された値を 0000-00-00 として保存します。 この設定は、無効な日付を記録する場合など、一部のシナリオで必要になる場合があります。 重要 場合によっては、ALLOW_INVALID_DATES モードによってデータの整合性の問題が発生する可能性があります。 使用シナリオと潜在的な影響を理解していることを確認してください。 このモードを使用する場合は注意してください。 |
ANSI_QUOTES | MySQL 5.6、MySQL 5.7、および MySQL 8.0 でサポートされています | ANSI_QUOTES モードを有効にします。 このモードでは、MySQL は二重引用符("")またはグレイブアクセント(``)を使用して識別子を引用符で囲みます。
sql_mode パラメータのデフォルト値が使用されている場合、MySQL は単一引用符('')を使用して文字列値を引用符で囲み、グレイブアクセント(``)を使用してテーブル名や列名などの識別子を引用符で囲みます。 例:
SELECT * FROM users WHERE `name` = 'John';
sql_mode パラメータを ANSI_QUOTES に設定すると、MySQL は ANSI SQL 標準に準拠するために、単一引用符('')を使用して文字列値を引用符で囲み、二重引用符("")またはグレイブアクセント(``)を使用して識別子を引用符で囲みます。 例:
SELECT * FROM "users" WHERE `name` = 'John';
ANSI_QUOTES モードは、ANSI SQL 標準との互換性を向上させます。 このモードは、特に MySQL が他のデータベースシステムと対話する場合に、文の移植性と整合性をより適切に確保できます。
重要 二重引用符("")を使用してすべてのデータベースの識別子を引用符で囲むことはできません。 ANSI_QUOTES モードを使用する場合は、モードが必要なデータベースと互換性があることを確認してください。 |
ERROR_FOR_DIVISION_BY_ZERO | MySQL 5.6、MySQL 5.7、および MySQL 8.0 でサポートされています | ゼロ除算演算で NULL を返す代わりに、警告またはエラーを報告します。 ERROR_FOR_DIVISION_BY_ZERO モードは、MOD(N,0) を含むゼロ除算演算に影響します。
INSERT や UPDATE などのデータ変更操作の場合、ERROR_FOR_DIVISION_BY_ZERO モードの効果は、厳密な SQL モード が有効になっているかどうかに左右されます。
ERROR_FOR_DIVISION_BY_ZERO モードが無効になっている場合、ゼロ除算演算に対して NULL が返され、警告は報告されません。 ERROR_FOR_DIVISION_BY_ZERO モードが有効になっている場合、ゼロ除算演算に対して NULL が返され、警告が報告されます。 ERROR_FOR_DIVISION_BY_ZERO モードと厳密な SQL モードが有効になっている場合、IGNORE も指定されていない限り、ゼロ除算演算に対してエラーが報告されます。 INSERT IGNORE 操作と UPDATE IGNORE 操作の場合、ゼロ除算演算に対して NULL が返され、警告が報告されます。
SELECT 操作の場合、ゼロ除算演算に対して NULL が返されます。 ERROR_FOR_DIVISION_BY_ZERO モードが有効になっている場合、厳密な SQL モードが有効になっているかどうかに関係なく、警告が報告されます。
ERROR_FOR_DIVISION_BY_ZERO モードは、厳密な SQL モードの一部ではありません。 ただし、厳密な SQL モードと組み合わせて使用する必要があり、デフォルトで有効になっています。 ERROR_FOR_DIVISION_BY_ZERO モードが有効になっているときに厳密な SQL モードが無効になっている場合、または厳密な SQL モードが有効になっているときに ERROR_FOR_DIVISION_BY_ZERO モードが無効になっている場合、警告が報告されます。
重要 ERROR_FOR_DIVISION_BY_ZERO モードによって、クエリまたは計算が中断される可能性があります。 使用シナリオと潜在的な影響を理解していることを確認してください。 このモードを使用する場合は注意してください。
|
HIGH_NOT_PRECDENCE SQL | MySQL 5.6、MySQL 5.7、および MySQL 8.0 でサポートされています | NOT 演算子の優先順位を高めます。
デフォルトでは、比較演算子は NOT 演算子よりも優先されます。 たとえば、NOT a BETWEEN b AND c は NOT (a BETWEEN b AND c) として解析されます。 以前の MySQL バージョンでは、NOT a BETWEEN b AND c は (NOT a) BETWEEN b AND c として解析されます。 HIGH_NOT_PRECEDENCE SQL モードを使用して、NOT 演算子の優先順位を高めることができます。
|
IGNORE_SPACE | MySQL 5.6、MySQL 5.7、および MySQL 8.0 でサポートされています | 関数名と開きかっこ ( の間にスペースを入れることができます。 これにより、組み込み関数名が予約語として扱われます。 IGNORE_SPACE モードは、ロード可能な関数またはストアド関数ではなく、組み込み関数に適用されます。 IGNORE_SPACE モードが有効になっているかどうかに関係なく、ロード可能な関数またはストアド関数の名前の後にスペースを入れることができます。
|
NO_AUTO_VALUE_ON_ZERO | MySQL 5.6、MySQL 5.7、および MySQL 8.0 でサポートされています | 自動インクリメント列のデフォルト値として 0 を使用できないようにします。 デフォルトでは、データの行を挿入するときに、自動インクリメント列の値が 0 に設定されている場合、MySQL は値 0 を次に使用可能な自動インクリメント値に自動的に置き換えます。 sql_mode パラメータを NO_AUTO_VALUE_ON_ZERO に設定すると、MySQL は自動インクリメント列のデフォルト値を 0 に設定できません。 このモードは、自動インクリメント列のデフォルト値が誤って 0 に設定されるのを防ぎます。 場合によっては、自動インクリメント列のデフォルト値が 0 に設定されていると、データの不整合またはエラーが発生する可能性があります。 例:
CREATE TABLE mytable (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50)
);
INSERT INTO mytable (id, name) VALUES (0, 'John');
NO_AUTO_VALUE_ON_ZERO モードが無効になっている場合、MySQL は id 列の値を次に使用可能な自動インクリメント値(1)に自動的に置き換えます。 sql_mode パラメータに NO_AUTO_VALUE_ON_ZERO を指定しないと、モードは無効になります。
sql_mode パラメータを NO_AUTO_VALUE_ON_ZERO に設定する場合は、次の項目に注意してください。
SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO';
CREATE TABLE mytable (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50)
);
INSERT INTO mytable (id, name) VALUES (0, 'John');
MySQL は、自動インクリメント列のデフォルト値として 0 を使用することを許可せず、エラーを報告します。 説明 NO_AUTO_VALUE_ON_ZERO モードは、自動インクリメント列のデフォルト値が 0 に設定されている場合にのみ適しています。 自動インクリメント列への手動挿入または更新には影響しません。
|
NO_BACKSLASH_ESCAPES | MySQL 5.6、MySQL 5.7、および MySQL 8.0 でサポートされています | バックスラッシュ(\)をエスケープ文字として使用できないようにします。 デフォルトでは、MySQL では、バックスラッシュ(\)をエスケープ文字として使用して、特殊文字またはエスケープ文字を文字列に挿入できます。 たとえば、\' を使用して単一引用符(')を表現し、\" を使用して二重引用符(")を表現し、\\ を使用してバックスラッシュ(\)を表現できます。 sql_mode パラメータを NO_BACKSLASH_ESCAPES に設定すると、MySQL はエスケープにバックスラッシュ(\)を使用できません。 この場合、バックスラッシュ(\)はエスケープ文字ではなく通常の文字として扱われます。
このモードは、バックスラッシュベースのエスケープによって発生する可能性のある混乱やエラーを防ぎます。 場合によっては、エスケープにバックスラッシュ(\)を使用すると、予期しない結果が発生する可能性があります。特に、多数のバックスラッシュ(\)を含むデータを処理する場合に発生する可能性があります。 例:
SET sql_mode = 'NO_BACKSLASH_ESCAPES';
SELECT 'It\'s a test';
デフォルトでは、前のクエリの 2 つの単一引用符(')の間のバックスラッシュ(\)はエスケープに使用されます。 ただし、sql_mode パラメータを NO_BACKSLASH_ESCAPES に設定すると、バックスラッシュ(\)はエスケープ文字ではなく通常の文字として扱われます。 その結果、クエリは It's a test ではなく It\'s a test を返します。 説明 NO_BACKSLASH_ESCAPES は、バックスラッシュベースのエスケープにのみ影響します。 二重引用符(")やその他の特殊文字などの他のエスケープ文字は影響を受けません。
|
NO_DIR_IN_CREATE | MySQL 5.6、MySQL 5.7、および MySQL 8.0 でサポートされています | CREATE TABLE 文で DIRECTORY を使用できないようにします。
デフォルトでは、CREATE TABLE 文で DATA DIRECTORY と INDEX DIRECTORY を指定できます。 sql_mode パラメータを NO_DIR_IN_CREATE に設定すると、MySQL は CREATE TABLE 文で DIRECTORY を使用できないようにします。 このモードは、ディレクトリを制限するか、CREATE TABLE 文でテーブルデータを保存する特定のディレクトリを指定できないようにします。 ディレクトリオプションは、セキュリティリスクをもたらしたり、データ管理の低下を引き起こしたりする可能性があります。 例:
SET sql_mode = 'NO_DIR_IN_CREATE';
CREATE TABLE mytable (
id INT PRIMARY KEY,
name VARCHAR(50)
) DIRECTORY = '/path/to/directory';
NO_DIR_IN_CREATE モードが有効になっている場合、MySQL は DIRECTORY オプションを拒否し、エラーを報告します。 sql_mode パラメータに NO_DIR_IN_CREATE を指定すると、このモードが有効になります。 プライマリ/セカンダリレプリケーションのシナリオでは、セカンダリデータベースでこのモードを有効にできます。
プライマリ/セカンダリ レプリケーション シナリオでは、セカンダリ データベースでこのモードを有効にできます。 説明 NO_DIR_IN_CREATE モードは、CREATE TABLE 文の DIRECTORY オプションにのみ影響し、他の操作またはテーブルディレクトリ関連の設定には影響しません。
|
NO_ENGINE_SUBSTITUTION | MySQL 5.6、MySQL 5.7、および MySQL 8.0 でサポートされています | テーブルの作成または変更時に、デフォルトのストレージエンジンを代替として使用できないようにします。 MySQL では、テーブルの作成または変更時に、指定されたストレージエンジンが使用できないかサポートされていない場合、MySQL はデフォルトのストレージエンジンを自動的に使用します。 sql_mode パラメータを NO_ENGINE_SUBSTITUTION に設定すると、MySQL はデフォルトのストレージエンジンを代替として使用できないようにします。 このモードは、指定されたストレージエンジンが使用されるようにし、ストレージエンジンの偶発的または不整合な置換を防ぎます。 例:
SET sql_mode = 'NO_ENGINE_SUBSTITUTION';
CREATE TABLE mytable (
id INT PRIMARY KEY,
name VARCHAR(50)
) ENGINE = 'NonexistentEngine';
NO_ENGINE_SUBSTITUTION モードが有効になっている場合、MySQL は存在しない指定されたストレージエンジンの使用を拒否し、エラーを報告します。 sql_mode パラメータに NO_ENGINE_SUBSTITUTION を指定すると、このモードが有効になります。 MySQL は、デフォルトのストレージエンジンを自動的に使用してテーブルを作成または変更しません。
説明 NO_ENGINE_SUBSTITUTION モードは、テーブルの作成または変更時にのみ有効になります。 既存のテーブルの使用またはその他のストレージエンジン関連の操作には影響しません。
|
NO_UNSIGNED_SUBTRACTION | MySQL 5.6、MySQL 5.7、および MySQL 8.0 でサポートされています | 符号なし整数の負の減算を無効にします。 デフォルトでは、整数の間の減算演算(一方が UNSIGNED 型)では、符号なしの結果が生成されます。 結果が負の場合、エラーが発生します。 sql_mode パラメータを NO_UNSIGNED_SUBTRACTION に設定すると、負の結果が許可されます。 このモードは、符号なし整数の間で減算演算を実行するときに予期しない結果を防ぎます。 場合によっては、符号なし整数の間の減算演算で予期しない負の結果が生成される可能性があります。 例:
SET sql_mode = 'NO_UNSIGNED_SUBTRACTION';
select cast(0 as unsigned)-1;
NO_UNSIGNED_SUBTRACTION モードが有効になっている場合、結果は -1 になります。 sql_mode パラメータに NO_UNSIGNED_SUBTRACTION を指定すると、このモードが有効になります。
重要 NO_UNSIGNED_SUBTRACTION モードが有効になっている場合、すべてのオペランドが符号なしであっても、減算結果は符号付きになります。 この設定は、BIGINT UNSIGNED がすべてのコンテキストで 100% 使用可能ではないことも示しています。
|
NO_ZERO_DATE | MySQL 5.6、MySQL 5.7、および MySQL 8.0 でサポートされています | DATE 列または DATETIME 列で "0000-00-00" を有効なゼロ日付値として使用できないようにします。 デフォルトでは、MySQL では、DATE 列または DATETIME 列で "0000-00-00" を有効なゼロ日付値として使用できます。 sql_mode パラメータを NO_ZERO_DATE に設定すると、MySQL は "0000-00-00" を有効な日付値として使用できなくなります。 NO_ZERO_DATE モードの効果は、厳密な SQL モードが有効になっているかどうかに左右されます。 NO_ZERO_DATE モードが無効になっている場合、"0000-00-00" が許可され、警告は報告されません。
NO_ZERO_DATE モードが有効になっている場合、"0000-00-00" が許可され、警告が報告されます。
NO_ZERO_DATE モードと厳密な SQL モードが有効になっている場合、IGNORE も指定されていない限り、"0000-00-00" は許可されず、エラーが報告されます。 INSERT IGNORE 操作と UPDATE IGNORE 操作の場合、"0000-00-00" が許可され、警告が報告されます。
このモードは、無効または不適切な日付値を防ぎます。 "0000-00-00" は実際の日付ではありません。 "0000-00-00" の使用を無効にすると、混乱や誤った結果を防ぐことができます。 例:
SET sql_mode = 'NO_ZERO_DATE';
INSERT INTO mytable (id, date_column) VALUES (1, '0000-00-00');
NO_ZERO_DATE モードが有効になっている場合、MySQL は date_column 列への "0000-00-00" の挿入を拒否し、エラーを報告します。 sql_mode パラメータに NO_ZERO_DATE を指定すると、このモードが有効になります。
説明 NO_ZERO_DATE モードは、日付値としての "0000-00-00" の使用にのみ影響します。 他の日付または時刻形式の処理には影響しません。
|
NO_ZERO _IN_DATE | MySQL 5.6、MySQL 5.7、および MySQL 8.0 でサポートされています | サーバーが年部分がゼロ以外で月部分または日部分が 0 の日付を許可するかどうかを指定します。 説明 このモードは、"2010-00-01" や "2010-01-00" などの日付に影響します。 "0000-00-00" には影響しません。 サーバーが "0000-00-00-00" を許可するかどうかを制御するには、NO_ZERO_DATE モードを使用します。 NO_ZERO_IN_DATE モードの効果は、厳密な SQL モードが有効になっているかどうかに左右されます。
NO_ZERO_IN_DATE モードが無効になっている場合、ゼロ部分を含む日付が許可され、警告は報告されません。
NO_ZERO_IN_DATE モードが有効になっている場合、ゼロ部分を含む日付は "0000-00-00" として挿入され、警告が報告されます。
NO_ZERO_IN_DATE モードと厳密な SQL モードが有効になっている場合、IGNORE も指定されていない限り、ゼロ部分を含む日付は許可されず、エラーが報告されます。 INSERT IGNORE 操作と UPDATE IGNORE 操作の場合、ゼロ部分を含む日付は "0000-00-00" として挿入され、警告が報告されます。
|
ONLY_FULL_GROUP_BY | MySQL 5.6、MySQL 5.7、および MySQL 8.0 でサポートされています | GROUP BY 句の厳密モードを設定します。
デフォルトでは、MySQL では、GROUP BY クエリで SELECT 文の列を GROUP BY 句に含めないことができます。 これは、MySQL の非標準拡張機能と見なされます。 たとえば、次のクエリはデフォルトモードで有効です。
SELECT id, name, MAX(score)
FROM mytable
GROUP BY id;
このクエリでは、name 列は GROUP BY 句に含まれていませんが、MySQL は引き続き結果を返します。 データベースによって異なる集約ルールが使用される可能性があるため、これにより結果に不確実性が生じる可能性があります。 sql_mode パラメータを ONLY_FULL_GROUP_BY に設定すると、MySQL は GROUP BY の厳密モードを有効にします。 厳密モードでは、SELECT 文のすべての非集約列が GROUP BY 句に含まれている必要があります。 要件が満たされていない場合、MySQL は「1055 (42000): SELECT リストが GROUP BY 句に含まれておらず、集計されていない列が含まれています」エラーを報告します。 たとえば、次のクエリは ONLY_FULL_GROUP_BY モードでエラーを返します。
たとえば、次のクエリは、ONLY_FULL_GROUP_BY モードでエラーを返します。
SET sql_mode = 'ONLY_FULL_GROUP_BY';
SELECT id, name, MAX(score)
FROM mytable
GROUP BY id;
このクエリでは、name 列は GROUP BY 句に含まれていないため、MySQL はエラーを報告します。 ONLY_FULL_GROUP_BY モードは、クエリ文が GROUP BY の標準構文に従い、クエリ結果の精度と信頼性を向上させるようにします。
|
PAD_CHAR_TO_FULL_LENGTH | MySQL 5.6、MySQL 5.7、および MySQL 8.0 でサポートされています | CHAR フィールドの末尾のスペースが削除されないように指定します。
CHAR フィールドが保存されると、列の値は Compact 形式の固定長値になります。 デフォルトでは、取得時に CHAR 列値から末尾のスペースが削除されます。
PAD_CHAR_TO_FULL_LENGTH モードが有効になっている場合、末尾のスペースは削除されず、取得された CHAR 値は完全な長さまで埋められます。
重要 このモードは、取得時に末尾のスペースが保持される VARCHAR 列には適していません。 |
PIPES_AS_CONCAT | MySQL 5.6、MySQL 5.7、および MySQL 8.0 でサポートされています | || を OR の同義語ではなく、CONCAT() と同じ機能を持つ文字列連結演算子として扱います。
|
REAL_AS_FLOAT | MySQL 5.6、MySQL 5.7、および MySQL 8.0 でサポートされています | REAL を FLOAT の同義語として扱います。
デフォルトでは、MySQL は REAL を DOUBLE の同義語として扱います。 |
STRICT_ALL_TABLES | MySQL 5.6、MySQL 5.7、および MySQL 8.0 でサポートされています | すべてのストレージエンジンに対して厳密な SQL モードを有効にします。 無効なデータ値は拒否されます。 デフォルトでは、MySQL は特定の暗黙的なデータ型変換と挿入操作を許可し、更新操作に対して警告を生成します。 sql_mode パラメータを STRICT_ALL_TABLES に設定すると、MySQL は厳密なデータ型一致と挿入および更新操作を必要とする厳密な SQL モードを有効にします。 STRICT_ALL_TABLES モードが有効になった後、以下のシナリオを含むがこれらに限定されないシナリオでエラーが報告されます。
データ型の不一致:挿入操作または更新操作中に列に値を指定し、データ型が一致しない場合、MySQL はエラーを報告します。 空でない列:挿入操作または更新操作中に空でない列に値が指定されていない場合、MySQL はエラーを報告します。 無効な日付または時刻:挿入操作または更新操作で無効な日付または時刻値が指定されている場合、MySQL はエラーを報告します。 ゼロ以外のデフォルト値:列のデフォルト値が 0 または NULL ではなく、挿入操作で列に値が指定されていない場合、MySQL はエラーを報告します。
STRICT_ALL_TABLES モードは、開発者がデータベース操作でデータ型の仕様と制限をより適切に遵守し、データの整合性と一貫性を向上させるのに役立ちます。
重要 STRICT_ALL_TABLES モードが有効になっていると、既存のアプリケーションでエラーが発生したり、既存のアプリケーションを変更する必要がある場合があります。 このモードを有効にする前に、アプリケーションとの互換性とアプリケーションへの影響を理解していることを確認してください。
説明 MySQL 5.7.4 から MySQL 5.7.7 では、STRICT_ALL_TABLES フィールドの有効な値は、ERROR_FOR_DIVISION_BY_ZERO モード、NO_ZERO_DATE モード、および NO_ZERO_IN_DATE モードです。 |
STRICT_TRANS_TABLES | MySQL 5.6、MySQL 5.7、および MySQL 8.0 でサポートされています | ストレージエンジンに対して厳密な SQL モードを有効にします。 詳細については、STRICT_ALL_TABLES の説明を参照してください。 重要 STRICT_TRANS_TABLES モードによって、エラーが発生したり、既存のアプリケーションを変更する必要がある場合があります。 このモードを有効にする前に、アプリケーションとの互換性とアプリケーションへの影響を理解していることを確認してください。
説明 MySQL 5.7.4 から MySQL 5.7.7 では、STRICT_TRANS_TABLES フィールドの有効な値は、ERROR_FOR_DIVISION_BY_ZERO 、NO_ZERO_DATE 、および NO_ZERO_IN_DATE です。 |
NO_AUTO_CREATE_USER | | GRANT 文でのユーザーの自動作成を無効にします。
デフォルトでは、GRANT 文で指定されたユーザーが存在しない場合、MySQL は GRANT 文に基づいてユーザーを自動的に作成します。 sql_mode パラメータを NO_AUTO_CREATE_USER に設定すると、MySQL はユーザーを自動的に作成しません。 このモードは、データベースのセキュリティを強化します。 このモードは、既存のユーザーのみがデータベースにアクセスすることを許可します。 例:
GRANT SELECT ON mydb.* TO 'new_user'@'localhost';
new_user ユーザーが存在せず、NO_AUTO_CREATE_USER モードが無効になっている場合、MySQL は自動的に new_user という名前のユーザーを作成し、SELECT 権限を付与します。フィールドを指定しない場合、モードは無効になります。 sql_mode パラメーターに NO_AUTO_CREATE_USER を指定しない場合、モードは無効になります。 sql_mode パラメーターを NO_AUTO_CREATE_USER に設定し、かつ new_user ユーザーが存在しない場合、MySQL はユーザーの作成を拒否し、エラーを報告します。
SET sql_mode = 'NO_AUTO_CREATE_USER';
GRANT SELECT ON mydb.* TO 'new_user'@'localhost';
NO_AUTO_CREATE_USER モードは、GRANT 文でのユーザーの自動作成にのみ影響します。 ユーザーの手動作成やその他のユーザー関連の操作には影響しません。
説明 MySQL 8.0 では、GRANT 文でユーザーを暗黙的に作成することはできなくなりました。 このフィールドは MySQL 8.0 で非推奨です。 |
NO_FIELD_OPTIONS | | SHOW CREATE TABLE 文の出力から MySQL 固有の列オプションを削除します。 このモードは、mysqldump の移植性モードで使用されます。
|
NO_KEY_OPTIONS | | SHOW CREATE TABLE 文の出力から MySQL 固有のインデックスオプションを削除します。 このモードは、mysqldump の移植性モードで使用されます。
|
NO_TABLE_OPTIONS | | SHOW CREATE TABLE 文の出力から、ENGINE などの MySQL 固有のテーブルオプションを削除します。 このモードは、mysqldump の移植性モードで使用されます。
|