SQL伺服器模式

2021-09-20 19:27:40 字數 4576 閱讀 7424

伺服器可以以不同的模式來操作,並且可以為不同客戶端應用不同模式。這樣每個應用程式可以根據自己的需求來定製的操作模式。

模式定義mysql應支援哪些sql語法,以及應執行哪種資料驗證檢查。這樣可以更容易地在不同的環境中使用mysql,並結合其它伺服器使用mysql。

1 可以用--sql-mode="modes"選項啟動mysqld來設定預設sql模式。

如果你想要重設,該值還可以為空(--sql-mode ="")。

2 可以在啟動後用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之間的日。這在web應用程式中,當你從三個不同的字段獲取年、月、日,並且想要確切儲存使用者插入的內容(不進行日期驗證)時很重要。該模式適用於date和datetime列。不適合timestamp列,timestamp列需要驗證日期。

啟用嚴格模式後,伺服器需要合法的月和日,不僅僅是分別在1到12和1到31範圍內。例如,禁用嚴格模式時'2004-04-31'是合法的,但啟用嚴格模式後是非法的。要想在嚴格模式允許遮掩固定日期,還應啟用allow_invalid_dates。

·ansi_quotes

將『"』視為識別符引號(『`』引號字元),不要視為字串的引號字元。在ansi模式,你可以仍然使用『`』來引用識別符。啟用ansi_quotes後,你不能用雙引號來引用字串,因為它被解釋為識別符。

·error_for_division_by_zero

在嚴格模式,在insert或update過程中,如果被零除(或mod(x,0)),則產生錯誤(否則為警告)。如果未給出該模式,被零除時mysql返回null。如果用到insert ignore或update ignore中,mysql生成被零除警告,但操作結果為null。

·high_not_precedence

not操作符的優先順序是表示式例如not a between b and c被解釋為not (a between b and c)。在一些舊版本mysql中, 表示式被解釋為(not a) between b and c。啟用high_not_precedencesql模式,可以獲得以前的更高優先順序的結果。

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

允許函式名和『(』之間有空格。強制將所有函式名視為儲存的字。結果是,如果你想要訪問儲存為字的資料庫、表或列名,你必須引用它。例如,因為有user()函式,mysql資料庫中的user表名和該錶內的user列被儲存下來,因此你必須引用它們:

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_date

在嚴格模式,不接受月或日部分為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來實現。

SQL鏈結伺服器

由於公司內部涉及到許多的庫之間的操作,相互間有很多是通過鏈結伺服器方式是直接訪問操作,具體增加鏈結伺服器的指令碼如下 被訪問的伺服器別名 declare servername varchar 20 被訪問的伺服器鏈結 declare serverip varchar 20 訪問的賬號 密碼 decl...

SQL鏈結伺服器

建立鏈結伺服器 sp addlinkedserver 引數 server db sql 被訪問的伺服器別名 srvproduct provider sqloledb datasrc server2 要訪問的伺服器 sp addlinkedsrvlogin 引數 db sql 被訪問的伺服器別名 fa...

伺服器 Reactor 模式

併發性不是太高伺服器程式使用這個模式基本就可以滿足。主線程只負責監聽檔案描述上是否有事件,如果有就立即將該事件通知到工作執行緒。讀寫資料 接受新的連線以及處理客戶端的訊息都在工作執行緒。工作流 1 主線程往 epoll 核心事件表中註冊 socket 上的讀就緒事件 2 主線程呼叫 epoll wa...