mysql SQL Server-Modi
MySQL-Server kann in verschiedenen SQL-Modi betrieben werden und verschiedene Modi können auf verschiedene Clients angewendet werden. Auf diese Weise kann jede Anwendung den Betriebsmodus des Servers an ihre eigenen Bedürfnisse anpassen.
Das Schema definiert, welche SQL-Syntax MySQL unterstützen soll und welche Art von Datenvalidierungsprüfungen durchgeführt werden sollen. Dies erleichtert die Verwendung von MySQL in verschiedenen Umgebungen und mit anderen Datenbankservern. Sie können mysqld mit der Option --sql-mode="modes" starten, um den Standard-SQL-Modus festzulegen. Dieser Wert kann auch leer gelassen werden (--sql-mode = „“), wenn Sie ihn zurücksetzen möchten. Sie können auch die Anweisung SET [SESSION|GLOBAL] sql_mode='modes' verwenden, um die Variable sql_mode
nach dem Start festzulegen, um den SQL-Modus zu ändern. Das Setzen einer GLOBAL-Variable erfordert die Berechtigung SUPER und wirkt sich ab diesem Zeitpunkt auf den Betrieb aller verbundenen Clients aus. Das Setzen der SESSION-Variable wirkt sich nur auf den aktuellen Client aus. Jeder Client kann seinen Sitzungs-sql_mode-Wert jederzeit ändern. Modesis ist eine Reihe verschiedener Modi, die durch Kommas („,“) getrennt sind. Sie können die SELECT @@sql_mode-Anweisung verwenden, um
den aktuellen Modus abzufragen. Der Standardwert ist leer (es ist kein Modus festgelegt). Hauptsächlich wichtiger sql_mode-Wert
・ANSI
Ändern Sie Syntax und Verhalten, um sie konsistenter mit Standard-SQL zu machen.
・STRICT_TRANS_TABLES
Brechen Sie die Anweisung ab, wenn der angegebene Wert nicht in die Transaktionstabelle eingefügt werden kann. Wenn bei nicht-transaktionalen Tabellen ein Wert in Zeile 1 einer einzeiligen oder mehrzeiligen Anweisung erscheint, wird die Anweisung verworfen. Eine detailliertere Beschreibung erfolgt später in diesem Abschnitt.
・TRADITIONELL
Machen Sie MySQL dazu, sich wie ein „traditionelles“ SQL-Datenbanksystem zu verhalten. Eine einfache Beschreibung dieses Modus besteht darin, „einen Fehler anstelle einer Warnung auszugeben“, wenn ein falscher Wert in eine Spalte eingefügt wird. Hinweis
: Geben Sie INSERT/UPDATE auf, sobald ein Fehler gefunden wird. Dies ist nicht das, was Sie möchten, wenn Sie eine nicht-transaktionale Speicher-Engine verwenden, da die vor dem Fehler vorgenommenen Datenänderungen nicht „übergehen“, was dazu führt, dass Updates „nur teilweise durchgeführt“ werden. Dieses Handbuch bezieht sich auf den „strikten Modus“, was einen Modus bedeutet, in dem mindestens STRICT _TRANS_TABLES oder STRICT _ALL_TABLES aktiviert ist. Alle unterstützten Modi werden unten beschrieben:
・ALLOW_INVALID_DATES
Überprüfen Sie nicht alle Daten im strengen Modus. Überprüft nur Monate zwischen 1 und 12 und Tage zwischen 1 und 31. Dies ist in Webanwendungen wichtig, wenn Sie Jahr, Monat und Tag aus drei verschiedenen Feldern erhalten und genau das speichern möchten, was der Benutzer eingegeben hat (ohne Datumsvalidierung). Dieser Modus funktioniert für die Spalten DATE und DATETIME. Nicht geeignet für TIMESTAMP-Spalten, die eine Datumsvalidierung erfordern. Wenn der strikte Modus aktiviert ist, benötigt der Server einen gültigen Monat und Tag, nicht nur in den Bereichen 1 bis 12 bzw. 1 bis 31. Beispielsweise ist „2004-04-31“ zulässig, wenn der strikte Modus deaktiviert ist, aber illegal, wenn der strikte Modus aktiviert ist. Um die Maskierung fester Daten im strengen Modus zu ermöglichen, sollte auch ALLOW_INVALID_DATES aktiviert sein.
・ANSI_QUOTES
Behandeln Sie „““ als Anführungszeichen für die Anführungszeichen (‘'' Anführungszeichen), nicht als Anführungszeichen für die Zeichenfolge
. Im ANSI-Modus können Sie dies tun Verwenden Sie weiterhin „“, um den Bezeichner in Anführungszeichen zu setzen. Wenn ANSI_QUOTES aktiviert ist, können Sie eine Zeichenfolge nicht in Anführungszeichen setzen, da sie im strikten Modus während des INSERT als Bezeichner interpretiert wird oder UPDATE, wenn durch Null geteilt (oder MOD(X, 0)), wird bei der Division durch Null ein Fehler generiert (andernfalls eine Warnung). Gibt NULL zurück , MySQL generiert eine Division durch Null-Warnung, aber das Operationsergebnis ist NULL HIGH_NOT_PRECEDENCE
NOT Die Priorität des Operators ist beispielsweise NOT a BETWEEN b AND c wird als NOT (a BETWEEN b AND c) interpretiert. In einigen älteren Versionen von MySQL wird der Ausdruck als (NOT a) BETWEEN b AND c interpretiert > Ergebnis.
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
・IGNORE_SPACE
erlaubt Leerzeichen zwischen Funktionsnamen und „(“. Erzwingt, dass alle Funktionsnamen als gespeicherte Wörter behandelt werden. Das Ergebnis ist, dass, wenn Sie Um auf einen als Wort gespeicherten Datenbank-, Tabellen- oder Spaltennamen zuzugreifen, müssen Sie ihn beispielsweise aufgrund der USER()-Funktion, des Benutzertabellennamens in MySQL-Datenbank und der Benutzerspalte in der Tabelle referenzieren werden gespeichert, daher müssen Sie sie zitieren:
SELECT "User" FROM mysql."user";
・NO_AUTO_CREATE_USER
防止GRANT自动创建新用户,除非还指定了密码。
・NO_AUTO_VALUE_ON_ZERO
NO_AUTO_VALUE_ON_ZERO影响AUTO_INCREMENT列的处理。一般情况,你可以向该列插入NULL或0生成下一个序列号。NO_AUTO_VALUE_ON_ZERO禁用0,因此只有NULL可以生成下一个序列号。
如果将0保存到表的AUTO_INCREMENT列,该模式会很有用。(不推荐采用该惯例)。例如,如果你用mysqldump转储表并重载,MySQL遇到0值一般会生成新的序列号,生成的表的内容与转储的表不同。重载转储文件前启用NO_AUTO_VALUE_ON_ZERO可以解决该问题。mysqldump在输出中自动包括启用NO_AUTO_VALUE_ON_ZERO的语句。
・NO_BACKSLASH_ESCAPES
禁用反斜线字符(‘\')做为字符串内的退出字符。启用该模式,反斜线则成为普通字符。
・NO_DIR_IN_CREATE
创建表时,忽视所有INDEX DIRECTORY和DATA DIRECTORY指令。该选项对从复制服务器有用。
・NO_ENGINE_SUBSTITUTION
如果需要的存储引擎被禁用或未编译,可以防止自动替换存储引擎。
・NO_FIELD_OPTIONS
不要在SHOW CREATE TABLE的输出中打印MySQL专用列选项。该模式在可移植模式(portability mode)下用于mysqldump。
・NO_KEY_OPTIONS
不要在SHOW CREATE TABLE的输出中打印MySQL专用索引选项。该模式在可移植模式(portability mode)下用于mysqldump。
・NO_TABLE_OPTIONS
不要在SHOW CREATE TABLE的输出中打印MySQL专用表选项(例如ENGINE)。该模式在可移植模式(portability mode)下用于mysqldump。
・NO_UNSIGNED_SUBTRACTION
在减运算中,如果某个操作数没有符号,不要将结果标记为UNSIGNED。请注意这样使UNSIGNED BIGINT不能100%用于上下文中。参见12.8节,“Cast函数和操作符”。
・NO_ZERO_DATE
在严格模式,不要将 '0000-00-00'做为合法日期。你仍然可以用IGNORE选项插入零日期。在非严格模式,可以接受该日期,但会生成警告。
・NO_ZERO_IN_DAT
在严格模式,不接受月或日部分为0的日期。如果使用IGNORE选项,我们为类似的日期插入'0000-00-00'。在非严格模式,可以接受该日期,但会生成警告。
・ONLY_FULL_GROUP_BY
不要让GROUP BY部分中的查询指向未选择的列。
・PIPES_AS_CONCAT
将||视为字符串连接操作符(+)(同CONCAT()),而不视为OR。
・REAL_AS_FLOAT
将REAL视为FLOAT的同义词,而不是DOUBLE的同义词。
・STRICT_TRANS_TABLES
为所有存储引擎启用严格模式。非法数据值被拒绝。后面有详细说明。
・STRICT_TRANS_TABLES
为事务存储引擎启用严格模式,也可能为非事务存储引擎启用严格模式。后面有详细说明。
严格模式控制MySQL如何处理非法或丢失的输入值。有几种原因可以使一个值为非法。例如,数据类型错误,不适合列,或超出范围。当新插入的行不包含某列的没有显示定义DEFAULT子句的值,则该值被丢失。
对于事务表,当启用STRICT_ALL_TABLES或STRICT_TRANS_TABLES模式时,如果语句中有非法或丢失值,则会出现错误。语句被放弃并滚动。
对于非事务表,如果插入或更新的第1行出现坏值,两种模式的行为相同。语句被放弃,表保持不变。如果语句插入或修改多行,并且坏值出现在第2或后面的行,结果取决于启用了哪个严格选项:
・对于STRICT_ALL_TABLES,MySQL返回错误并忽视剩余的行。但是,在这种情况下,前面的行已经被插入或更新。这说明你可以部分更新,这可能不是你想要的。要避免这点,最好使用单行语句,因为这样可以不更改表即可以放弃。
・对于STRICT_TRANS_TABLES,MySQL将非法值转换为最接近该列的合法值并插入调整后的值。如果值丢失,MySQL在列中插入隐式 默认值。在任何情况下,MySQL都会生成警告而不是给出错误并继续执行语句。13.1.5节,“CREATE TABLE语法”描述了隐式默认值。
Der strikte Modus erlaubt keine illegalen Daten wie „2004-04-31“. Es sind keine verbotenen Datumsangaben zulässig, die den Teil „Null“ verwenden, z. B. „00.04.2004“ oder „Null“-Datumsangaben. Um es zu deaktivieren, aktivieren Sie die SQL-Modi NO_ZERO_IN_DATE und NO_ZERO_DATE basierend auf dem strikten Modus.
Wenn Sie den strikten Modus nicht verwenden (d. h. den Modus STRICT_TRANS_TABLES oder STRICT_ALL_TABLES nicht aktivieren), fügt MySQL angepasste Werte ein und gibt eine Warnung bei illegalen oder fehlenden Werten aus. Im strikten Modus können Sie dies über INSERT IGNORE oder UPDATE IGNORE tun. Siehe Abschnitt 13.5.4.22, „SHOW WARNINGS-Syntax“.
Das obige ist der detaillierte Inhalt vonEine kurze Einführung in den SQL-Servermodus von MySQL. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!