Festlegen des globalen sql_mode in MySQL

88

Ich versuche, sql_mode in mysql festzulegen, aber es wird ein Fehler ausgegeben.

Befehl:

set global sql_mode='NO_BACKSLASH_ESCAPES','STRICT_TRANS_TABLE','NO_AUTO_CREATE_USER','NO_ENGINE_SUBSTITUTION'

Ist dies nicht der richtige Weg, um mehrere Modi einzustellen? Was sind die Vorteile der Einstellung von Sitzungs- und globalen Modi? was wird bevorzugt? Ich habe verschiedene Benutzer, die versuchen, die Datenbank mit verschiedenen UNC-Werten zu aktualisieren, und habe den Sitzungsmodus auf 'NO_BACKSLASH_ESCAPES' gesetzt. Ich denke, es wäre sinnvoll, einen gloabl-Modus dafür zu erstellen. Macht das Sinn?

Lass es mich wissen, bitte.

Vielen Dank.

JPro
quelle
Diese fehlerhaften Zitate stören mich wirklich; p. Wie andere sagten, bin ich mir sicher, das ist definitiv nicht richtig, nur deswegen.
Dyasta

Antworten:

198

Übrigens, wenn Sie in MySQL Globals setzen:

SET GLOBAL sql_mode = 'NO_ENGINE_SUBSTITUTION';
SET SESSION sql_mode = 'NO_ENGINE_SUBSTITUTION';

Dadurch wird es nicht dauerhaft eingestellt und nach jedem Neustart zurückgesetzt.

Sie sollten dies also in Ihrer Konfigurationsdatei /etc/mysql/my.cnffestlegen (z. B. im Abschnitt [mysqld]), damit die Änderungen nach dem Neustart von MySQL wirksam bleiben:

Konfigurationsdatei: /etc/mysql/my.cnf

[mysqld] 
sql_mode = NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

UPDATE: Neuere Versionen von MySQL (z. B. 5.7.8 oder höher) erfordern möglicherweise eine etwas andere Syntax:

[mysqld]
sql-mode="STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION"

Stellen Sie sicher, dass zwischen sql-modekeinem Unterstrich ein Bindestrich steht und dass die Modi in doppelten Anführungszeichen stehen.

Verweisen Sie immer auf die MySQL-Dokumente für Ihre Version, um die Optionen für den SQL-Modus anzuzeigen .

Chadwick Meyer
quelle
2
Vielen Dank, die Einstellung in my.cnf hat den Trick für mich getan. Auf dieser Seite erfahren Sie, was die Standard-sql_modes in 5.7 und höher sind: dev.mysql.com/doc/refman/5.7/en/sql-mode.html
Richard
2
5.7 Version beachten! Das war das Problem.
Ernestas Stankevičius
In einer tatsächlichen Webanwendung funktioniert die zweite Abfrage. Ich habe gerade eine weitere Abfrage nach der mysqli-Verbindungsabfrage hinzugefügt. SET SESSION sql_mode = 'NO_ENGINE_SUBSTITUTION'; Danke Chad!
GTodorov
1
In 5.7.20und für den Fall mysql.ini, einen Unterstrich zu verwenden und die Anführungszeichen zu vergessen, funktioniert das sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
einwandfrei
27

Ich habe es gelöst.

Der richtige Modus ist:

set global sql_mode="NO_BACKSLASH_ESCAPES,STRICT_TRANS_TABLE,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
JPro
quelle
16
WARNUNG: Nach unserer Erfahrung behält dies die Einstellung nach einem MySQL-Neustart nicht bei ...
Chadwick Meyer
1
Ja, dies behält die Einstellungen nach dem Neustart nicht bei
prakashpoudel
4
Um es nach dem Neustart für Unix beizubehalten, musste ich eine ~ / .my.cnf-Datei erstellen und [mysqld] sql_mode = "<neuer Modus>" hinzufügen. Hoffe das hilft
Raman Singh
27

Festlegen des SQL-Modus dauerhaft mithilfe der MySQL-Konfigurationsdatei.

In meinem Fall muss ich die Datei ändern, /etc/mysql/mysql.conf.d/mysqld.cnfwie mysql.conf.din enthalten /etc/mysql/my.cnf. Ich ändere dies unter [mysqld]

[mysqld]
sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

ONLY_FULL_GROUP_BYIch habe gerade den SQL-Modus entfernt, weil er ein Problem verursacht hat.

Ich verwende ubuntu 16.04, php 7und mysql --version gib mir diesesmysql Ver 14.14 Distrib 5.7.13, for Linux (x86_64) using EditLine wrapper

Nach dieser Änderung führen Sie die folgenden Befehle aus

sudo service mysql stop
sudo service mysql start

Überprüfen Sie nun die SQL-Modi anhand dieser Abfrage, SELECT @@sql_modeund Sie sollten die gerade festgelegten Modi erhalten.

Yashrajsinh Jadeja
quelle
14

In Konfigurationsdatei kopieren: /etc/mysql/my.cnf OR /bin/mysql/my.ini

[mysqld]
port = 3306
sql-mode=""

MySQL Neustart.

Oder du kannst es auch tun

[mysqld]
port = 3306
SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";

MySQL Neustart.

Devraj Gupta
quelle
2
Ich denke es ist sql_modestatt sql-mode.
Raman Sahasi
13

Für jemanden, der diesen Fehler für MySQL 8 googelt.

MySQL 8.0.11 entfernt den 'NO_AUTO_CREATE_USER' aus dem SQL-Modus.

MySQL 5.7: Verwenden von GRANT zum Erstellen von Benutzern. Verwenden Sie stattdessen CREATE USER. Wenn Sie diese Vorgehensweise befolgen, spielt der SQL-Modus NO_AUTO_CREATE_USER für GRANT-Anweisungen keine Rolle, sodass er ebenfalls veraltet ist. MySQL 8.0.11: Verwenden von GRANT zum Erstellen von Benutzern. Verwenden Sie stattdessen CREATE USER. Wenn Sie diese Vorgehensweise befolgen, spielt der SQL-Modus NO_AUTO_CREATE_USER für GRANT-Anweisungen keine Rolle, sodass er ebenfalls entfernt wird.

Von hier genommen

So sql_modekann es sein:

sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

Wenn Sie Docker verwenden, können Sie docker-compose.yml den nächsten Befehl hinzufügen

  mysql:
    image: mysql:8.0.13
    command: --sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
    ports:
      - 13306:${MYSQL_PORT}
Serhii Popov
quelle
3

Verwenden Sie für temporäre Änderungen den folgenden Befehl

set global sql_mode="NO_BACKSLASH_ESCAPES,STRICT_TRANS_TABLE,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION" 

Für dauerhafte Änderungen: Gehen Sie zur Konfigurationsdatei /etc/my.cnf oder /etc/mysql/mysql.conf.d/mysqld.cnf und fügen Sie die folgenden Zeilen hinzu. Starten Sie dann den MySQL-Dienst neu

[mysqld]
sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
Vineet Kumar
quelle
2

Greifen Sie als Administrator auf die Datenbank zu (root möglicherweise).

Überprüfen Sie den aktuellen SQL_Mode

mysql> SELECT @@sql_mode;

Um einen neuen sql_mode festzulegen, beenden Sie die Datenbank und erstellen Sie eine Datei

nano /etc/mysql/conf.d/<filename>.cnf 

mit Ihrem sql_mode Inhalt

[mysqld]
sql_mode=NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

Starten Sie MySQL neu

mysql> sudo service mysql stop
mysql> sudo service mysql start

Wir erstellen eine Datei im Ordner /etc/mysql/conf.d/, da in der Hauptkonfigurationsdatei /etc/mysql/my.cnf der Befehl so geschrieben ist, dass er alle Einstellungsdateien aus dem Ordner / etc / mysql / conf enthält. d /

Eric Korolev
quelle
1

In meinem Fall muss ich die Datei /etc/mysql/mysql.conf.d/mysqld.cnfändern, ändern Sie dies unter [ mysqld]

Fügen Sie diese Zeile in den mysqldAbschnitt [ ] ein

sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
Shashikant Parmar
quelle
1

Ich hatte gerade ein ähnliches Problem, bei dem MySQL (5.6.45) sql_modevon keiner Konfigurationsdatei akzeptiert wurde .

Die Lösung bestand darin init_file = /etc/mysql/mysql-init.sql, der Konfigurationsdatei etwas hinzuzufügen und dort auszuführen SET GLOBAL sql_mode = '';.

Cobra_Fast
quelle
0

Wenn jemand es nur für die aktuelle Sitzung festlegen möchte, verwenden Sie den folgenden Befehl

set session sql_mode="NO_BACKSLASH_ESCAPES,STRICT_TRANS_TABLE,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
ASHOK MANGHAT
quelle
0

Überprüfen Sie die Dokumentation von sql_mode

Methode 1:

Überprüfen Sie den Standardwert von sql_mode:

SELECT @@sql_mode //check current value for sql_mode

SET GLOBAL sql_mode = "NO_BACKSLASH_ESCAPES,STRICT_TRANS_TABLE,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION";

Methode 2:

Greifen Sie auf phpmyadmin zu, um Ihre zu bearbeiten sql_mode

  • Melden Sie sich bei phpmyadmin an und öffnen Sie localhost
  • Top on Variablen , die oben in den Menüelementen angezeigt werden, und suchen Sie nach dem SQL-Modus
  • Klicken Sie auf die Schaltfläche Bearbeiten, um sql_mode an Ihre Anforderungen anzupassen
  • Speichern Sie die Änderungen

Einstellungen für den SQL-Modus in phpmyadmin

Starten Sie den Server neu, nachdem Sie die oben genannten Schritte ausgeführt haben

Ankit Jindal
quelle
0

In meinem Fall MySQL und Ubuntu 18.04

Ich habe es mit diesem Befehl dauerhaft eingestellt

sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

Fügen Sie die Zeile nach der Konfiguration hinzu. Siehe Beispiel im Bild unten.

sql_mode = ""

Hinweis: Sie können hier auch verschiedene Modi hinzufügen. Dies hängt von Ihren Anforderungen ab. NO_BACKSLASH_ESCAPES, STRICT_TRANS_TABLE, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION

Siehe Referenz zu verfügbaren SQL-Modi und Dokumentation

Hinzufügen des SQL-Modus

Dann speichern. Nach dem Speichern müssen Sie Ihren MySQL-Dienst neu starten. Befolgen Sie dazu den folgenden Befehl:

sudo service mysql restart

Hoffe das hilft :-)

Cristiana Chavez
quelle
-3
set global sql_mode = "NO_BACKSLASH_ESCAPES, STRICT_TRANS_TABLE, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION"
Shadab Khan Zed
quelle