Den MySQL-STRICT-Mode verstehen und mit ihm arbeiten

Seit MySQL 5.1 ist er möglich und seit 5.7 per Standard aktiv: der MySQL-Modus "STRICT", genauer STRICT_TRANS_TABLES.

Er ist einer von etlichen möglichen Modi, die auch parallel gesetzt sein können (derzeit gibt es u.a.)

STRICT_TRANS_TABLES,ONLY_FULL_GROUP_BY,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

 

Was bewirkt der STRICT-Mode?

Der STRICT-Modus sorgt v.a. dafür, dass bei Einfüge- und Änderungs-Operationen (INSERT & UPDATE) kontrolliert wird, ob alle Werte der Definition entsprechen, also gültig bzw. vorhanden sind. Ist dem nicht der Fall, wird die Operation nicht ausgeführt sondern mit deiner entsprechenden Fehlermeldung quittiert.

 

Vor allem bei bereits bestehenden Skripten, die bislang wunderbar funktionierten, weil der MySQL-Server die abgesetzten Operationen tolerant behandelte, werden damit mehr oder weniger gravierende Fehlverhalten festzustellen sein. Die Programmierungen müssen also allesamt überprüft und ggf. angepasst werden. Als schnelle und vorübergehende Abhilfe kann dabei das Abschalten des STRICT-Mode in Frage kommen.

 

Hier ein paar Beispiele für solche Fehler:

 

  • Uncaught TYPO3 Exception
    #1247602160: Field 'xyz' doesn't have a default value
  • ERROR 1067 (42000): Invalid default value for 'xyz'

 

So kannst du herausfinden, welcher sql_mode derzeit aktiv ist:

 

SELECT @@sql_mode;
// Rückgabe z.B.: NO_ENGINE_SUBSTITUTION

 

 

So wird der sql_mode gesetzt und der STRICT-Modus aktiviert bzw. deaktivert:

 

  • per SQL (nur für die aktuelle Sitzung)

    STRICT Ausschalten:
    SET SESSION sql_mode = "NO_ENGINE_SUBSTITUTION";

    STRICT Anschalten
    SET SESSION sql_mode = "STRICT_TRANS_TABLES";
     
  • per SQL (für die globale Umgebung - gültig bis zum Neustart des Servers)
    STRICT deaktivieren:
    SET GLOBAL sql_mode='NO_ENGINE_SUBSTITUTION';
    STRICT aktivieren:
    SET GLOBAL sql_mode='STRICT_TRANS_TABLES';
    
  • per zentraler MySQL-Konfiguration
    meist in der Datei: /etc/mysql/my.cnf - ansonsten mal hier nachschlagen: https://dev.mysql.com/doc/refman/8.0/en/option-files.html

    [mysqld]
    sql_mode="NO_ENGINE_SUBSTITUTION"
    // oder
    sql_mode="STRICT_TRANS_TABLES"

    Anschließend den MySQL-Server neu durchstarten mittels
    sudo /etc/init.d/mysql restart