ホームページ  >  記事  >  データベース  >  MySQL のデフォルトの SQL モードを設定する方法

MySQL のデフォルトの SQL モードを設定する方法

王林
王林転載
2023-05-27 21:52:301901ブラウズ

SQL モード

MySQL 5.7 のデフォルトの SQL モードには、ONLY_FULL_GROUP_BYSTRICT_TRANS_TABLESNO_ZERO_IN_DATENO_ZERO_DATE が含まれます。 、ERROR_FOR_DIVISION_BY_ZERONO_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_ZERONO_ZERO_DATE、および NO_ZERO_IN_DATE モードは、 MySQL 5.7.8 で追加されました。デフォルトの SQL モード値に対するこれらの変更に関する追加の説明については、「MySQL 5.7 での SQL モードの変更」を参照してください。"

show sql mode

SELECT @@GLOBAL.sql_mode;

SELECT @@SESSION.sql_mode;

set 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…

デフォルトの SQL モード

ONLY_FULL_GROUP_BY

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_TABLES

MySQL の厳密モードでは、INSERT または UPDATE ステートメントで無効な値または欠落している値を処理する方法を制御できます。値はさまざまな理由で無効になる可能性があります。たとえば、列のデータ型が間違っているか、範囲外である可能性があります。この問題は、NULL 以外の列の値が欠落しており、定義でデフォルト値が明示的に指定されていない新しい行が挿入された場合に発生します。

たとえば、フィールド設定の 1 つを NULL にすることはできず、挿入するデータのフィールドが NULL の場合、合格せず、次のようにエラーが報告されます。

1364 - フィールド「ディーラー」にはデフォルト値がありません

##では、この問題を解決するにはどうすればよいでしょうか?この問題は誰もがよく遭遇すると思いますが、通常、データを挿入するときにエンティティの属性に値が割り当てられていないため、この問題が発生するため、コードを確認してから属性に値を割り当てます。
STRICT_TRANS_TABLES

, この方法では検証は実行されませんが、データの整合性を確保する必要があるため、コードレベルで適切な作業を行う必要があるため、これはあまりお勧めできません。 NO_ZERO_IN_DATE

NO_ZERO_IN_DATE モードは、年の部分が 0 以外で、月または日の部分が 0 である日付をサーバーが許可するかどうかに影響します。 (このモードは、「2010-00-01」や「2010-01-00」などの日付には影響しますが、「0000-00-00」には影響しません。サーバーが「0000-00-00」を許可するかどうかを制御するには、NO_ZERO_DATE モードを使用します。 .) NO_ZERO_IN_DATE の効果は、厳密な SQL モードが有効かどうかにも依存します。厳密な SQL モード

STRICT_TRANS_TABLES

が有効になっていない場合、NO_ZERO_IN_DATE を有効にしても意味がありません。 次の SQL の日付月日が 0 で、厳密モード

STRICT_TRANS_TABLES

および NO_ZERO_IN_DATE が有効な場合、エラーが報告されます。 <pre class="brush:sql;">INSERT INTO `blue`.`shop` (`article`, `dealer` ,`price`,`date`) VALUES (&amp;#39;商品5&amp;#39;, &amp;#39;5&amp;#39;, 5.00, &amp;#39;2022-00-00&amp;#39;);</pre>

1292 - 不正な日時値: 行 1 の列 'date' の '2022-00-00'

厳密モー​​ドを削除
STRICT_TRANS_TABLES

NO_ZERO_IN_DATE はエラーを報告しません。 NO_ZERO_DATE

上記の NO_ZERO_IN_DATE では、「0000-00-00」を挿入できます。厳密モード

STRICT_TRANS_TABLES

と NO_ZERO_DATE が使用されている場合、「0000-00」は挿入できません。 -00'。 ERROR_FOR_DIVISION_BY_ZERO

INSERT または UPDATE の場合、被除数が 0 の場合、エラーが発生しデータを挿入できません。MOD(N,M)

INSERT INTO `blue`.`shop` (`article`,dealer ,`price`,`date`) VALUES (&#39;商品5&#39;, &#39;5&#39;, MOD(10,0), &#39;0000-00-00&#39;);
も同様です。

SELECT の場合、被除数が 0 の場合、MOD(N,M) と同様に NULL が返されます。

SELECT price / 0  FROM shop

エラー メッセージ: 1365 - 0による除算

NO_AUTO_CREATE_USER

grant コマンドを使用して、パスワードが空のユーザーを作成することはできません。

NO_ENGINE_SUBSTITUTION

如果指定了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

MySQL存储引擎

SHOW ENGINES;

MySQL默认的sql mode怎么设置

以上がMySQL のデフォルトの SQL モードを設定する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。