Heim > Datenbank > MySQL-Tutorial > Hauptteil

So legen Sie den Standard-SQL-Modus von MySQL fest

王林
Freigeben: 2023-05-27 21:52:30
nach vorne
1901 Leute haben es durchsucht

SQL-Modus

Der Standard-SQL-Modus von MySQL 5.7 umfasst ONLY_FULL_GROUP_BY, STRICT_TRANS_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER und NO_ENGINE_SUBSTITUTION. ONLY_FULL_GROUP_BY, STRICT_TRANS_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, and NO_ENGINE_SUBSTITUTION

这是MySQL官网的原文描述:“These modes were added to the default SQL mode in MySQL 5.7: The ONLY_FULL_GROUP_BY and STRICT_TRANS_TABLES modes were added in MySQL 5.7.5. The NO_AUTO_CREATE_USER mode was added in MySQL 5.7.7. The ERROR_FOR_DIVISION_BY_ZERO, NO_ZERO_DATE, and NO_ZERO_IN_DATE modes were added in MySQL 5.7.8. For additional discussion regarding these changes to the default SQL mode value, see SQL Mode Changes in MySQL 5.7.”

show sql mode

SELECT @@GLOBAL.sql_mode;

SELECT @@SESSION.sql_mode;
Nach dem Login kopieren

set sql mode

设置为GLOBAL,那么所有的客户端都会受到影响,不过要拥有SUPER权限才能进行设置,也就是root用户,设置SESSION,那么受影响的只是当前的连接会话。

SET GLOBAL sql_mode ='ONLY_FULL_GROUP_BY'

SET SESSION sql_mode ='ONLY_FULL_GROUP_BY'
Nach dem Login kopieren

下面我们就针对默认设置的这几种SQL mode进行详细的讲解,其他的哪些大家可以去官网参考。

docs.oracle.com/cd/E17952_0…

默认的SQL mode

ONLY_FULL_GROUP_BY

设置了这个值,如果使用GROUP BY,在SELECT后面出现的字段,在GROUP BY后面必须出现,不然报错如下

Expression #3 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'blue.shop.price' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with 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后面只有一个字段,而SELECT * 是查出所有字段,所以就报错。

SELECT * FROM shop GROUP BY article
Nach dem Login kopieren

这样写就不会报错

SELECT * FROM shop GROUP BY article , dealer , price
Nach dem Login kopieren

不过我们不可能使用一个GROUP BY,后面还要跟着所有字段,显然不合理,那么就应该将其关闭,只需要将其去掉就行

STRICT_TRANS_TABLES

MySQL的严格模式可以控制如何处理INSERT或UPDATE语句中的无效或缺失的值。一个值可能因多种原因无效。例如,它可能具有列的错误数据类型,或者它可能超出了范围。缺少非空列的值没有在定义中明确指定默认值,则插入的新行会出现该问题。

比如我们的某个字段设置不能为NULL,而我们插入的数据这个字段为NULL,那么就不能通过,就会报错如下:

1364 - Field 'dealer' doesn't have a default value

那么这个问题要怎么解决呢?我相信这个问题大家经常遇到,一般是我们在插入数据的时候实体的属性没有赋值,所以导致这个问题,所以我们会去检查代码,然后给属性赋值,另外一种做法就是去除STRICT_TRANS_TABLES,这样就不会进行校验,不过是极其不推荐这样做的,因为要我们要保证数据的完整性,所以必须在代码层面做好工作。

NO_ZERO_IN_DATE

NO_ZERO_IN_DATE模式会影响服务器是否允许年部分不为零但月或日部分为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,那么就会报错。

INSERT INTO `blue`.`shop` (`article`, `dealer` ,`price`,`date`) VALUES ('商品5', '5', 5.00, '2022-00-00');
Nach dem Login kopieren

1292 - Incorrect datetime value: '2022-00-00' for column 'date' at row 1

去除严格模式STRICT_TRANS_TABLESNO_ZERO_IN_DATE就不会报错。

NO_ZERO_DATE

上面的NO_ZERO_IN_DATE可以插入'0000-00-00',如果使用了严格模式STRICT_TRANS_TABLES

Dies ist die Originalbeschreibung von der offiziellen MySQL-Website: „Diese Modi wurden dem Standard-SQL-Modus in MySQL 5.7 hinzugefügt: Die Modi ONLY_FULL_GROUP_BY und STRICT_TRANS_TABLES wurden in MySQL hinzugefügt 5.7.5 Der NO_AUTO_CREATE_USER-Modus wurde in MySQL 5.7.7 hinzugefügt. Der ERROR_DIVISION_BY_ZERO, NO_ZERO_DATE Modi wurden in MySQL 5.7.8 hinzugefügt. Weitere Informationen zu diesen Änderungen am Standard-SQL-Moduswert finden Sie unter SQL-Modusänderungen in MySQL 5.7 Clients Alle sind betroffen, aber Sie müssen über SUPER-Berechtigungen verfügen, um es einzurichten. Das heißt, der Root-Benutzer legt SESSION fest, dann ist nur die aktuelle Verbindungssitzung betroffen.

INSERT INTO `blue`.`shop` (`article`,dealer ,`price`,`date`) VALUES ('商品5', '5', MOD(10,0), '0000-00-00');
Nach dem Login kopieren

Nachfolgend erläutern wir die Standard-SQL-Modi im Detail. Weitere Informationen finden Sie auf der offiziellen Website.

docs.oracle.com/cd/E17952_0…

Der Standard-SQL-Modus

ONLY_FULL_GROUP_BY

legt diesen Wert fest. Wenn GROUP BY verwendet wird, müssen die Felder, die nach SELECT erscheinen, nach GROUP BY erscheinen, andernfalls wird der Fehler angezeigt wird wie folgt gemeldet

Ausdruck Nr. 3 der SELECT-Liste ist nicht in der GROUP BY-Klausel und enthält die nicht aggregierte Spalte „blue.shop.price“, die funktional nicht von den Spalten in der GROUP BY-Klausel abhängig ist; dies ist nicht kompatibel mit sql_mode=only_full_group_by

🎜 🎜Verwenden Sie wie folgt den Standard-SQL-Modus von MySQL🎜🎜🎜ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION🎜🎜🎜Dann meldet die folgende Anweisung einen Fehler, da es nur ein Feld gibt nach GROUP BY und SELECT * findet alle Felder, also Melden Sie einen Fehler. 🎜
SELECT price / 0  FROM shop
Nach dem Login kopieren
🎜Wenn Sie so schreiben, wird kein Fehler gemeldet🎜
CREATE TABLE store ( `name` VARCHAR ( 255 ) DEFAULT NULL ) ENGINE = InnoDBTest
Nach dem Login kopieren
Nach dem Login kopieren
🎜Allerdings ist es für uns unmöglich, ein GROUP BY gefolgt von allen Feldern zu verwenden, was offensichtlich unvernünftig ist, also sollte es geschlossen werden, entfernen Sie es einfach🎜🎜STRICT_TRANS_TABLES🎜 🎜 Der strikte Modus von MySQL steuert, wie ungültige oder fehlende Werte in INSERT- oder UPDATE-Anweisungen behandelt werden. Ein Wert kann aus vielen Gründen ungültig sein. Es könnte beispielsweise sein, dass die Spalte den falschen Datentyp hat oder außerhalb des gültigen Bereichs liegt. Dieses Problem tritt bei neu eingefügten Zeilen auf, bei denen der Wert einer Nicht-Null-Spalte fehlt und der Standardwert nicht explizit in der Definition angegeben ist. 🎜🎜Wenn beispielsweise eine unserer Feldeinstellungen nicht NULL sein darf und das Feld der von uns eingefügten Daten NULL ist, wird es nicht bestanden und es wird ein Fehler wie folgt gemeldet: 🎜🎜🎜1364 – Feld „Händler“ nicht Es gibt keinen Standardwert🎜 🎜🎜Wie kann man dieses Problem lösen? Ich glaube, dass jeder auf dieses Problem stößt. Im Allgemeinen wird dem Attribut der Entität beim Einfügen von Daten kein Wert zugewiesen, was dieses Problem verursacht. Daher überprüfen wir den Code und weisen dem Attribut dann einen Wert zu STRICT_TRANS_TABLES , auf diese Weise wird keine Überprüfung durchgeführt, es wird jedoch dringend davon abgeraten, da wir die Integrität der Daten sicherstellen müssen und daher auf Codeebene gute Arbeit leisten müssen. Der 🎜🎜NO_ZERO_IN_DATE🎜🎜NO_ZERO_IN_DATE-Modus beeinflusst, ob der Server Daten zulässt, bei denen der Jahresteil ungleich Null ist, der Monats- oder Tagesteil jedoch 0 ist. (Dieser Modus betrifft Datumsangaben wie „01.00.2010“ oder „00.01.2010“, jedoch nicht „0000-00-00“. Um zu steuern, ob der Server „0000-00-00“ zulässt, verwenden Sie den Modus „NO_ZERO_DATE“. .) Die Auswirkung von NO_ZERO_IN_DATE hängt auch davon ab, ob der strikte SQL-Modus STRICT_TRANS_TABLES nicht aktiviert ist, es ist sinnlos, NO_ZERO_IN_DATE zu aktivieren. 🎜🎜Der Datumsmonat und -tag des folgenden SQL ist 0 und der strikte Modus STRICT_TRANS_TABLES und NO_ZERO_IN_DATE sind aktiviert, dann wird ein Fehler gemeldet. 🎜
SHOW CREATE TABLE store
Nach dem Login kopieren
Nach dem Login kopieren
🎜🎜1292 – Falscher Datum/Uhrzeit-Wert: „2022-00-00“ für Spalte „Datum“ in Zeile 1🎜🎜🎜Das Entfernen des strengen Modus STRICT_TRANS_TABLES und NO_ZERO_IN_DATE funktioniert nicht Arbeit Es wird ein Fehler gemeldet. 🎜🎜NO_ZERO_DATE🎜🎜Das obige NO_ZERO_IN_DATE kann „0000-00-00“ einfügen. Wenn der strikte Modus STRICT_TRANS_TABLES und NO_ZERO_DATE verwendet werden, kann „0000-00-00“ nicht eingefügt werden. 🎜🎜ERROR_FOR_DIVISION_BY_ZERO🎜🎜Wenn bei INSERT oder UPDATE der Dividend 0 ist, tritt ein Fehler auf und die Daten können nicht eingefügt werden. Das Gleiche gilt für MOD(N,M)🎜
CREATE TABLE `store` (
  `name` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
Nach dem Login kopieren
Nach dem Login kopieren
🎜Bei SELECT gilt, wenn der Dividend 0 ist. dann wird NULL zurückgegeben, das gleiche gilt für MOD(N,M). 🎜
SHOW ENGINES;
Nach dem Login kopieren
Nach dem Login kopieren
🎜🎜Fehlermeldung: 1365 – Division durch 0🎜🎜🎜NO_AUTO_CREATE_USER🎜🎜Sie können den Grant-Befehl nicht verwenden, um einen Benutzer mit einem leeren Passwort zu erstellen. 🎜

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
Nach dem Login kopieren
Nach dem Login kopieren

查看创建过程

SHOW CREATE TABLE store
Nach dem Login kopieren
Nach dem Login kopieren

结果

CREATE TABLE `store` (
  `name` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
Nach dem Login kopieren
Nach dem Login kopieren

MySQL存储引擎

SHOW ENGINES;
Nach dem Login kopieren
Nach dem Login kopieren

MySQL默认的sql mode怎么设置

Das obige ist der detaillierte Inhalt vonSo legen Sie den Standard-SQL-Modus von MySQL fest. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:yisu.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage