MySQL 5.7 のデフォルトの 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
。
これは MySQL 公式 Web サイトの元の説明です: 「これらのモードは、MySQL 5.7 のデフォルト SQL モードに追加されました: ONLY_FULL_GROUP_BY
および STRICT_TRANS_TABLES
モードが追加されました」 MySQL 5.7 .5 では、NO_AUTO_CREATE_USER
モードが MySQL 5.7.7 で追加されました。ERROR_FOR_DIVISION_BY_ZERO
、NO_ZERO_DATE
、および NO_ZERO_IN_DATE
モードは、 MySQL 5.7.8 で追加されました。デフォルトの SQL モード値に対するこれらの変更に関する追加の説明については、「MySQL 5.7 での SQL モードの変更」を参照してください。"
SELECT @@GLOBAL.sql_mode; SELECT @@SESSION.sql_mode;
GLOBAL に設定すると、すべてのクライアントが影響を受けますが、これを設定するには SUPER 権限、つまり root ユーザーが必要で、SESSION を設定すると、現在の接続セッションのみが影響を受けます。
SET GLOBAL sql_mode ='ONLY_FULL_GROUP_BY' SET SESSION sql_mode ='ONLY_FULL_GROUP_BY'
以下では、デフォルトの SQL モードについて詳しく説明します。その他の情報については、公式 Web サイトを参照してください。
docs.oracle.com/cd/E17952_0…
GROUP BY を使用する場合は、この値を設定します。 SELECT の後に表示されるフィールドは GROUP BY の後に表示する必要があります。そうでない場合は、次のようなエラーが発生します。
#SELECT リストの式 #3 が GROUP BY 句になく、非集計列 'blue.shop.price' が含まれています。 ' これは GROUP BY 句のカラムに機能的に依存していません。これは sql_mode=only_full_group_by
と互換性がありません。以下では MySQL のデフォルトの sql_mode
ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE を使用します。 NO_ZERO_DATE ,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
次に、次のステートメントはエラーを報告します。これは、GROUP BY の後にフィールドが 1 つしかなく、SELECT * はすべてのフィールドを検索することになるため、エラーが報告されます。
SELECT * FROM shop GROUP BY article
このように書いてもエラーは報告されません
SELECT * FROM shop GROUP BY article , dealer , price
ただし、GROUP BYに続いてすべてのフィールドを使用することは不可能です。明らかに不合理なので、オフにする必要があります。
#STRICT_TRANS_TABLESMySQL の厳密モードでは、INSERT または UPDATE ステートメントで無効な値または欠落している値を処理する方法を制御できます。値はさまざまな理由で無効になる可能性があります。たとえば、列のデータ型が間違っているか、範囲外である可能性があります。この問題は、NULL 以外の列の値が欠落しており、定義でデフォルト値が明示的に指定されていない新しい行が挿入された場合に発生します。 たとえば、フィールド設定の 1 つを NULL にすることはできず、挿入するデータのフィールドが NULL の場合、合格せず、次のようにエラーが報告されます。1364 - フィールド「ディーラー」にはデフォルト値がありません##では、この問題を解決するにはどうすればよいでしょうか?この問題は誰もがよく遭遇すると思いますが、通常、データを挿入するときにエンティティの属性に値が割り当てられていないため、この問題が発生するため、コードを確認してから属性に値を割り当てます。STRICT_TRANS_TABLES
, この方法では検証は実行されませんが、データの整合性を確保する必要があるため、コードレベルで適切な作業を行う必要があるため、これはあまりお勧めできません。 NO_ZERO_IN_DATE
が有効になっていない場合、NO_ZERO_IN_DATE を有効にしても意味がありません。 次の SQL の日付月日が 0 で、厳密モード
および NO_ZERO_IN_DATE が有効な場合、エラーが報告されます。 <pre class="brush:sql;">INSERT INTO `blue`.`shop` (`article`, `dealer` ,`price`,`date`) VALUES (&#39;商品5&#39;, &#39;5&#39;, 5.00, &#39;2022-00-00&#39;);</pre>
厳密モードを削除STRICT_TRANS_TABLES
NO_ZERO_IN_DATE
はエラーを報告しません。 NO_ZERO_DATE
と NO_ZERO_DATE が使用されている場合、「0000-00」は挿入できません。 -00'。 ERROR_FOR_DIVISION_BY_ZERO
INSERT INTO `blue`.`shop` (`article`,dealer ,`price`,`date`) VALUES ('商品5', '5', MOD(10,0), '0000-00-00');も同様です。
SELECT の場合、被除数が 0 の場合、MOD(N,M) と同様に NULL が返されます。
SELECT price / 0 FROM shopエラー メッセージ: 1365 - 0による除算
NO_AUTO_CREATE_USER
如果指定了NO_ENGINE_SUBSTITUTION,我们在创建表或者修改表的时候,如果去指定了不存在或者不支持的存储引擎,那么就会报错,无法创建和修改,如果没有配置NO_ENGINE_SUBSTITUTION,那么就会将我们指定的存储引擎(不支持或者不存在)的存储引擎替换为默认的存储引擎,MySQL5.7后的默认存储引擎为InnoDB,所以就会自动设置为InnoDB。
如下我们创建表,将存储引擎设置为一个不存在的InnoDBTest
,因为我们去除了NO_ENGINE_SUBSTITUTION,所以不会报错,并且会替换成默认的InnoDB
创建sql
CREATE TABLE store ( `name` VARCHAR ( 255 ) DEFAULT NULL ) ENGINE = InnoDBTest
查看创建过程
SHOW CREATE TABLE store
结果
CREATE TABLE `store` ( `name` varchar(255) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
SHOW ENGINES;
以上がMySQL のデフォルトの SQL モードを設定する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。