首頁  >  文章  >  資料庫  >  簡單介紹Mysql的SQL伺服器模式

簡單介紹Mysql的SQL伺服器模式

怪我咯
怪我咯原創
2017-04-01 10:42:391345瀏覽

mysql SQL伺服器模式
MySQL伺服器可以以不同的SQL模式來操作,並且可以為不同客戶端套用不同模式。這樣每個應用程式可以根據自己的需求來客製化伺服器的操作模式。
模式定義MySQL應支援哪些SQL語法,以及應執行哪種資料驗證檢查。這樣可以更容易在不同的環境中使用MySQL,並結合其它資料庫伺服器使用MySQL。
你可以用--sql-mode="modes"選項啟動mysqld來設定預設SQL模式。如果你想要重設,該值還可以為空(--sql-mode ="")。
你也可以在啟動後用SET [SESSION|GLOBAL] sql_mode='modes'語句設定sql_mode變數來變更SQL模式。設定GLOBAL變數時需要擁有SUPER權限,並且會影響從那時起連線的所有客戶端的操作。設定SESSION變數只影響目前的客戶端。任何客戶端可以隨時變更自己的會話 sql_mode值。
Modesis是用逗號(‘,')間隔開的一系列不同的模式。你可以用SELECT @@sql_mode語句查詢目前的模式。預設值是空(沒有設定任何模式)。
主要重要sql_mode值
・ANSI
#更改語法和行為,使其更符合標準SQL。
・STRICT_TRANS_TABLES
如果不能將給定的值插入到交易表中,則放棄該語句。對於非交易表,如果值出現在單行語句或多行語句的第1行,則放棄該語句。本節後面給出了更詳細的描述。
・TRADITIONAL
Make MySQL的行為象「傳統」SQL資料庫系統。此模式的簡單描述是當在列中插入不正確的值時「給出錯誤而不是警告」。 註解:一旦發現錯誤立即放棄INSERT/UPDATE。如果你使用非事務儲存引擎,這種方式不是你想要的,因為出現錯誤前進行的資料更改不會“滾動”,結果是更新“只進行了一部分”。
本手冊指“嚴格模式”,表示至少STRICT _TRANS_TABLES或STRICT _ALL_TABLES被啟用的模式。
下面描述了支援的所有模式:
・ALLOW_INVALID_DATES
在嚴格模式下不要檢查全部日期。只檢查1到12之間的月份和1到31之間的日。這在網路應用程式中,當你從三個不同的欄位獲取年、月、日,並且想要確切保存用戶插入的內容(不進行日期驗證)時很重要。此模式適用於DATE和DATETIME欄位。不適合TIMESTAMP列,TIMESTAMP列需要驗證日期。
啟用嚴格模式後,伺服器需要合法的月和日,而不僅僅是分別在1到12和1到31範圍內。例如,在停用嚴格模式時'2004-04-31'是合法的,但啟用嚴格模式後是非法的。要想在嚴格模式允許遮掩固定日期,也應啟用ALLOW_INVALID_DATES。
・ANSI_QUOTES
將'"'視為識別符引號('`'引號字元),不要視為字串的引號字元。在ANSI模式,你可以仍然使用'`'來引用識別符。
#在嚴格模式,在INSERT或UPDATE過程中,如果被零除(或MOD(X,0)),則產生錯誤(否則為警告)。傳回NULL。運算子
的優先順序是表達式例如NOT a BETWEEN b AND c 解釋為NOT (a BETWEEN b AND c)。 a) BETWEEN b AND c。

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
允許函數名稱和'('之間有空格。強制將所有函數名稱視為保存的字。結果是,如果你想要存取儲存為字的資料庫、表或列名,你必須引用它。你必須引用它們:

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语法”描述了隐式默认值。
嚴格模式不允許非法日期,例如'2004-04-31'。它不允許禁止日期使用“零”部分,例如'2004-04-00'或“零”日期。若要禁止,應在嚴格模式基礎上,啟用NO_ZERO_IN_DATE和NO_ZERO_DATE SQL模式。
如果你不使用嚴格模式(即不啟用STRICT_TRANS_TABLES或STRICT_ALL_TABLES模式),對於非法或遺失的值,MySQL將插入調整後的值並給出警告。在嚴格模式,你可以透過INSERT IGNORE或UPDATE IGNORE來實現。參見13.5.4.22節,「SHOW WARNINGS語法」。


以上是簡單介紹Mysql的SQL伺服器模式的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn