Der MySQL-Server kann in verschiedenen SQL-Modi betrieben werden und diese Modi auf unterschiedliche Weise für verschiedene Clients anwenden. Diese Funktionalität erlaubt es jeder Anwendung, den Betriebsmodus des Servers an die eigenen Anforderungen anzupassen.
Modi definieren, welche SQL-Syntax MySQL unterstützen soll und welche Art von Gültigkeitsprüfungen in Bezug auf die Daten durchgeführt werden sollen. Dies erleichtert die Verwendung von MySQL in verschiedenen Umgebungen und in Verbindung mit anderen Datenbankservern.
Sie stellen den SQL-Standardmodus ein, indem Sie mysqld mit der Option --sql-mode=" starten. modes"modes ist hierbei eine Liste verschiedener Modi, die durch Kommata (‘,’) voneinander getrennt sind. Der Standardwert ist leer (d. h. es sind keine Modi ausgewählt). Der Wert modes kann ebenfalls als leer angegeben werden (--sql-mode=""), wenn Sie ihn explizit löschen wollen.
Sie können den SQL-Modus zur Laufzeit mithilfe der Anweisung SET [GLOBAL|SESSION] sql_mode=' zur Einstellung des Systemwertes modes'sql_mode ändern. Die Einstellung der GLOBAL-Variable erfordert die Berechtigung SUPER und wirkt sich auf den Betrieb aller Clients aus, die nachfolgend eine Verbindung herstellen. Von der Änderung der SESSION-Variable ist nur der aktuelle Client betroffen. Jeder Client kann jederzeit seinen eigenen sql_mode-Sitzungswert ändern.
Sie können den globalen oder sitzungsspezifischen sql_mode-Wert mit den folgenden Anweisungen ändern:
SELECT @@global.sql_mode; SELECT @@session.sql_mode;
Die wahrscheinlich wichtigsten sql_mode-Werte sind die folgenden:
Ändert Syntax und Verhalten so, dass eine höhere Kompatibilität mit Standard-SQL erzielt wird.
Wenn ein Wert nicht wie eingegeben in eine transaktionssichere Tabelle eingefügt werden konnte, wird die Anweisung abgebrochen. Bei nicht transaktionssicheren Tabellen wird die Anweisung abgebrochen, wenn der Wert in einer Anweisung für genau einen Datensatz oder im ersten Datensatz einer Anweisung für mehrere Datensätze erscheint. Weitere Informationen erhalten Sie im Verlauf dieses Abschnitts.
Hierbei verhält sich MySQL wie ein „traditionelles“ SQL-Datenbanksystem. Eine einfache Beschreibung dieses Modus wäre: „Gib eine Fehlermeldung anstelle einer Warnung aus, wenn ein falscher Wert in eine Spalte eingefügt wird“. Hinweis: Die Anweisung INSERT/UPDATE wird abgebrochen, sobald der Fehler bemerkt wird. Wenn Sie eine nicht transaktionssichere Speicher-Engine verwenden, ist dies ein unter Umständen unerwünschtes Verhalten, weil Datenänderungen, die vor dem Fehler ausgeführt wurden, nicht rückgängig gemacht werden, was zu einer „unvollständigen“ Aktualisierung führt.
Wenn in diesem Handbuch vom „strikten Modus“ die Rede ist, bezeichnet dies einen Modus, in dem zumindest STRICT_TRANS_TABLES oder STRICT_ALL_TABLES aktiviert ist.
Die folgende Liste beschreibt alle unterstützten Modi:
Führt keine vollständige Datumsüberprüfung durch. Geprüft wird nur, ob die Monatsangabe zwischen 1 und 12 und die Tagesangabe zwischen 1 und 31 liegt. Dies ist sehr praktisch für Webanwendungen, bei denen man die Jahres-, Monats- und Tagesangabe drei verschiedenen Feldern entnimmt und diese Angaben dann genau so gespeichert werden sollen, wie der Benutzer sie eingegeben hat (d. h. ohne Plausibilitätsprüfung). Dieser Modus betrifft DATE- und DATETIME-Spalten. Für TIMESTAMP-Spalten gilt er hingegen nicht, da diese immer ein gültiges Datum erfordern.
Für den Server ist es erforderlich, dass Monats- und Tagesangaben gültig sind und sich nicht einfach nur in den Bereichen 1 bis 12 bzw. 1 bis 31 bewegen. Wenn der strikte Modus deaktiviert ist, werden ungültige Daten wie '2004-04-31' in '0000-00-00' umgewandelt, und es wird eine Warnung erzeugt. Ist der strikte Modus hingegen aktiviert, dann erzeugen ungültige Datumsangaben einen Fehler. Um derartige Daten zuzulassen, aktivieren Sie ALLOW_INVALID_DATES.
Hierbei wird ‘"’ als Anführungszeichen für Bezeichner (wie ‘`’) und nicht als String-Anführungszeichen behandelt. Auch wenn dieser Modus aktiviert ist, können Sie ‘`’ als Anführungszeichen für Bezeichner verwenden. Ist ANSI_QUOTES aktiviert, dann dürfen Sie doppelte Anführungszeichen für einen literalen String verwenden, da dieser andernfalls als Bezeichner erkannt würde.
Erzeugt im strikten Modus einen Fehler (sonst eine Warnung), wenn bei INSERT- oder UPDATE-Anweisungen eine Division durch Null (oder MOD(X,0)) auftritt. Wenn dieser Modus nicht aktiviert ist, gibt MySQL stattdessen NULL als Ergebnis einer Division durch Null zurück. Bei INSERT IGNORE oder UPDATE IGNORE erzeugt MySQL eine Warnung bezüglich einer Division durch Null, das Ergebnis des Vorgangs ist aber NULL.
Die Vorrangstellung des Operators NOT besteht darin, dass Ausdrücke wie NOT a BETWEEN b AND c als NOT (a BETWEEN b AND c) verarbeitet werden. Bei einigen älteren Versionen von MySQL wurde der Ausdruck hingegen als (NOT a) BETWEEN b AND c aufgefasst. Dieses ältere Vorrangsverhalten kann verwendet werden, indem man den SQL-Modus HIGH_NOT_PRECEDENCE aktiviert.
mysql>SET sql_mode = '';mysql>SELECT NOT 1 BETWEEN -5 AND 5;-> 0 mysql>SET sql_mode = 'broken_not';mysql>SELECT NOT 1 BETWEEN -5 AND 5;-> 1
Gestattet Leerzeichen zwischen einem Funktionsnamen und dem Zeichen ‘(’. Hierdurch wird die Behandlung aller Funktionsnamen als reservierte Wörter erzwungen. Dies wiederum bedingt, dass Sie Datenbank-, Tabellen- oder Spaltennamen, die Sie verwenden wollen, als referenzierte Wörter in Anführungszeichen setzen müssen. Weil es beispielsweise eine Funktion USER() gibt, sind die Namen der Tabelle user in der mysql-Datenbank und der Spalte User in dieser Tabelle reservierte Wörter, müssen also in Anführungszeichen gesetzt werden:
SELECT "User" FROM mysql."user";
Der SQL-Modus IGNORE_SPACE gilt für integrierte Funktionen, nicht aber für gespeicherte Routinen. Nach einem Routinennamen müssen unabhängig davon, ob IGNORE_SPACE aktiviert ist oder nicht, immer Leerzeichen stehen dürfen.
Verhindert, dass GRANT automatisch neue Benutzer erstellt, sofern es dies tun würde (es sei denn, es wird ein nicht leeres Passwort angegeben).
NO_AUTO_VALUE_ON_ZERO wirkt sich auf die Verarbeitung von AUTO_INCREMENT-Spalten aus. Normalerweise erzeugen Sie die nächste Sequenznummer für die Spalte, indem Sie entweder NULL oder 0 einfügen. NO_AUTO_VALUE_ON_ZERO unterdrückt dieses Verhalten für 0, sodass nur NULL die nächste Sequenznummer erzeugt.
Dieser Modus kann nützlich sein, wenn 0 in einer AUTO_INCREMENT-Spalte einer Tabelle gespeichert wurde. (Nebenbei gesagt: Das Speichern von 0 ist keine empfehlenswerte Vorgehensweise.) Wenn Sie beispielsweise die Tabelle mit mysqldump speichern und sie dann neu laden, erzeugt MySQL normalerweise neue Sequenznummern, sobald die 0-Werte gefunden werden; das Ergebnis ist also eine Tabelle, deren Inhalt sich von dem ursprünglich gespeicherten unterscheidet. Die Aktivierung von NO_AUTO_VALUE_ON_ZERO vor dem Neuladen der Speicherauszugsdatei löst dieses Problem. mysqldump schließt nun automatisch eine Anweisung in seine Ausgabe mit ein, die NO_AUTO_VALUE_ON_ZERO aktiviert, um das Problem zu vermeiden.
Deaktiviert die Verwendung des Backslashs (‘\’) als Escape-Zeichen innerhalb von Strings. Wenn dieser Modus aktiviert ist, wird der Backslash zu einem ganz gewöhnlichen Zeichen.
Wenn Sie eine Tabelle erstellen, werden in diesem Modus alle INDEX DIRECTORY- und DATA DIRECTORY-Direktiven ignoriert. Diese Option ist praktisch bei Slave-Replikationsservern.
NO_ENGINE_SUBSTITUTION
Verhindert die automatische Ersetzung der vorgabeseitigen Speicher-Engine, wenn eine Anweisung wie CREATE TABLE eine Speicher-Engine angibt, die deaktiviert oder nicht einkompiliert ist.
Sorgt dafür, dass MySQL-spezifische Spaltenoptionen in der Ausgabe von SHOW CREATE TABLE nicht angegeben werden. Dieser Modus wird von mysqldump im Portabilitätsmodus verwendet.
Sorgt dafür, dass MySQL-spezifische Indexoptionen in der Ausgabe von SHOW CREATE TABLE nicht angegeben werden. Dieser Modus wird von mysqldump im Portabilitätsmodus verwendet.
Sorgt dafür, dass MySQL-spezifische Tabellenoptionen (wie ENGINE) in der Ausgabe von SHOW CREATE TABLE nicht angegeben werden. Dieser Modus wird von mysqldump im Portabilitätsmodus verwendet.
Bei Subtraktionsoperationen wird das Ergebnis nicht als UNSIGNED gekennzeichnet, wenn einer der Operanden ohne Vorzeichen ist. Beachten Sie, dass hiermit BIGINT UNSIGNED nicht mehr in allen Kontexten hundertprozentig einsetzbar ist. Siehe auch Abschnitt 12.8, „Cast-Funktionen und Operatoren“.
Im strikten Modus wird '0000-00-00' nicht als gültiges Datum zugelassen. Mit der Option IGNORE können Sie trotzdem Nulldatumsangaben einfügen. Außerhalb des strikten Modus wird das Datum zwar akzeptiert, aber es wird eine Warnung erzeugt.
Im strikten Modus werden Daten nicht akzeptiert, wenn die Monats- oder Tagesangabe 0 ist. Wenn der Modus mit der Option IGNORE verwendet wird, fügt MySQL das Datum '0000-00-00' für derartige Datumsangaben ein. Außerhalb des strikten Modus wird das Datum zwar akzeptiert, aber es wird eine Warnung erzeugt.
Erlaubt keine Abfragen, bei denen die GROUP BY-Klausel auf eine Spalte verweist, die in der Ausgabespaltenliste nicht vorhanden ist.
Behandelt || als Operator zur String-Verkettung (also identisch mit CONCAT()) statt als Synonym von OR.
Behandelt REAL als Synonym von FLOAT. Standardmäßig behandelt MySQL REAL als Synonym von DOUBLE.
Aktiviert den strikten Modus für alle Speicher-Engines. Ungültige Datenwerte werden abgewiesen. Zusätzliche Informationen folgen.
Aktiviert den strikten Modus für transaktionssichere Speicher-Engines sowie – sofern möglich – für nicht transaktionssichere Speicher-Engines. Zusätzliche Informationen folgen.
Der strikte Modus steuert, wie MySQL Eingabewerte behandelt, die ungültig sind oder fehlen. Ein Wert kann aus mehreren Gründen ungültig sein. So kann er den falschen Datentyp für die Spalte aufweisen oder außerhalb des zulässigen Bereichs liegen. Ein Wert fehlt, wenn ein neuer Datensatz, der eingefügt werden soll, keinen Wert für eine Spalte enthält, für die keine explizite DEFAULT-Klausel definiert ist.
Bei transaktionssicheren Tabellen tritt bei ungültigen oder fehlenden Werten in einer Anweisung ein Fehler auf, wenn einer der Modi STRICT_ALL_TABLES oder STRICT_TRANS_TABLES aktiviert ist. Die Anweisung wird abgebrochen, und es erfolgt ein Rollback.
Bei nicht transaktionssicheren Tabellen ist das Verhalten in beiden Modi gleich, wenn der betreffende Wert im ersten einzufügenden oder zu aktualisierenden Datensatz auftritt. Die Anweisung wird abgebrochen, und die Tabelle bleibt unverändert. Wenn die Anweisung mehrere Datensätze einfügt oder ändert und der unpassende Wert im zweiten oder einem nachfolgenden Datensatz auftritt, dann hängt das Ergebnis davon ab, welche Option aktiviert ist:
Bei STRICT_ALL_TABLES gibt MySQL einen Fehler zurück und ignoriert die verbleibenden Datensätze. Allerdings bleiben die zuvor durch Einfügung oder Aktualisierung an Datensätzen vorgenommenen Änderung erhalten. Das bedeutet, dass unter Umständen eine Teilaktualisierung erfolgt, was vielleicht nicht wünschenswert ist. Um dies zu vermeiden, sollten Sie am besten Anweisungen nur für jeweils einen Datensatz verwenden, da diese abgebrochen werden können, ohne die Tabelle zu verändern.
Bei STRICT_TRANS_TABLES wandelt MySQL einen ungültigen Wert in den nächstgelegenen für die Spalte gültigen Wert um und fügt diesen umgewandelten Wert dann ein. Fehlt ein Wert, dann fügt MySQL den impliziten Vorgabewert für den Spaltendatentyp ein. In beiden Fällen erzeugt MySQL zudem eine Warnung (statt eines Fehlers) und fährt dann mit der Verarbeitung der Anweisung fort. Implizite Vorgabewerte sind in Abschnitt 11.1.4, „Vorgabewerte von Datentypen“, beschrieben.
Der strikte Modus untersagt ungültige Datumswerte wie '2004-04-31'. Nicht verboten sind hingegen Datumsangaben mit Nullbestandteilen wie etwa '2004-04-00' oder „Nulldaten“. Um auch diese zu unterbinden, aktivieren Sie die SQL-Modi NO_ZERO_IN_DATE und NO_ZERO_DATE zusätzlich zum strikten Modus.
Wenn Sie den strikten Modus nicht verwenden (d. h. weder STRICT_TRANS_TABLES noch STRICT_ALL_TABLES sind aktiviert), dann fügt MySQL korrigierte Werte für ungültige oder fehlende Angaben ein und erzeugt Warnungen. Im strikten Modus können Sie dieses Verhalten erzeugen, indem Sie INSERT IGNORE bzw. UPDATE IGNORE verwenden. Siehe auch Abschnitt 13.5.4.25, „SHOW WARNINGS“.
Die folgenden Spezialmodi sind als Abkürzungen für Kombinationen von Moduswerten aus obiger Liste aufzufassen.
Die Beschreibungen enthalten alle Moduswerte, die in der aktuellen MySQL-Version vorhanden sind. Bei älteren Versionen enthalten die Kombinationsmodi keine einzelnen Moduswerte, die erst in neueren Versionen verfügbar sind.
Entspricht REAL_AS_FLOAT, PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE. Siehe auch Abschnitt 1.9.3, „MySQL im ANSI-Modus laufen lassen“.
Entspricht PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, NO_KEY_OPTIONS, NO_TABLE_OPTIONS, NO_FIELD_OPTIONS.
Entspricht PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, NO_KEY_OPTIONS, NO_TABLE_OPTIONS, NO_FIELD_OPTIONS, NO_AUTO_CREATE_USER.
Entspricht PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, NO_KEY_OPTIONS, NO_TABLE_OPTIONS, NO_FIELD_OPTIONS.
Entspricht NO_FIELD_OPTIONS, HIGH_NOT_PRECEDENCE.
Entspricht NO_FIELD_OPTIONS, HIGH_NOT_PRECEDENCE.
Entspricht PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, NO_KEY_OPTIONS, NO_TABLE_OPTIONS, NO_FIELD_OPTIONS, NO_AUTO_CREATE_USER.
Entspricht PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, NO_KEY_OPTIONS, NO_TABLE_OPTIONS, NO_FIELD_OPTIONS.
Entspricht STRICT_TRANS_TABLES, STRICT_ALL_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER.
Dies ist eine Übersetzung des MySQL-Referenzhandbuchs, das sich auf dev.mysql.com befindet. Das ursprüngliche Referenzhandbuch ist auf Englisch, und diese Übersetzung ist nicht notwendigerweise so aktuell wie die englische Ausgabe. Das vorliegende deutschsprachige Handbuch behandelt MySQL bis zur Version 5.1.
