mysql 用戶變量(@)和系統變量(@@ show variables 和 show global variables 區別)


一般系統定義的全局變量(又稱系統變量)都是以@@開頭,用戶自定義變量(簡稱用戶變量)以@開頭

MySQL變量類型:

 MySQL通過變量來定義當前服務器的特性,保存狀態信息等。我們可以通過手動更改變量的值來配置MySQL,也可以通過變量獲得MySQL的當前狀態信息。MySQL的變量類型可以從變量的修改方式和變量的生效范圍划分。

根據變量修改的方式:

動態變量:可以在MySQL運行時調整其指,並立即生效;set global sort_buffer_size=value

靜態變量:需要在配置文件中修改,重啟服務后生效;/etc/my.cnf

根據變量的生效范圍:

全局變量:服務級別的設定,對整個服務生效,所有回話,當時已經連接不生效,重新聯系才生效;set global sort_buffer_size=value

會話變量:僅對當前會話生效,其他會話和新會話不受影響;會話結束值即銷毀;set session sort_buffer_size=value

二、查看MySQL的變量:

1.查看可以在配置文件中定義的變量:

shell> mysqld --help --verbose

2.查看MySQL的服務當前運行時的變量:

mysql> SHOW [{GLOBAL|SESSION}] VARIABLES [LIKE ''];
mysql> SELECT @@{GLOBAL|SESSION}.VARIABLE_NAME;
mysql> SELECT * FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES WHERE VARIABLE_NAME='VARIABLE_NAME';
mysql> SELECT * FROM INFORMATION_SCHEMA.SESSION_VARIABLES WHERE VARIABLE_NAME='VARIABLE_NAME';

三、修改MySQL的變量:

1.通過配置文件修改:

     通過配置文件修改,只需要在配置文件中指定變量命和值,重啟服務即可,例如:

shell> vim /etc/my.cnf
       innodb_file_per_table = 1
shell> service mysqld restart

     通過配置文件修改的變量會永久生效。

2.運行時直接修改:

     運行時修改使用SET命令,並指定變量類型(全局或會話)給變量賦值即可,例如:

mysql> SET GLOBAL innodb_file_per_table = 1
mysql> SET SESSION innodb_file_per_table = 1

     需要注意的是,全局變量中運行時修改的值不會永久生效,重啟后會失效,如果是會話變量的話,會話斷開即失效。

 

MySQL列類型的作用:

列類型可以簡單理解為用來對用戶往列種存儲數據時做某種范圍"限定",它可以定義數據的有效值(字符、數字等)、所能占據的最大存儲空間、字符長度(定長或變長)、是否能夠被索引、如何被索引及如何排序等。在關系型數據庫系統中,為了實現數據的易於管理,必須為表字段(列)指定對應的列類型。MySQL的列類型可以分為4類:字符型、數值型、日期及時間型、自有類型。

字符型:

 字符型限定值只能為字符,MySQL的字符類型如下:

類型            最大字符長度         名稱及特性
char            255                定長字符串,區分大小寫
varchar         65535              變長字符串,區分大小寫
binary          255                二進制定長字符串,區分大小寫
varbinary       65535              二進制變長字符串,區分大小寫

tinytext        255                text類型是文本大對象存儲,就是說它存儲的並不是數據本身,而是一個指針,指向數據的存儲所在位置;text不區分大小寫
text            65535
mediumtext      16777215
longtext        4294967295

tinyblob        255                blob類型是二進制大對象存儲,它是text的二進制形式,區分大小寫
blob            65535
mediumblob      16777215
longblob        4294967295

數值型:

數值型限定只能存儲數值類數據,MySQL的數值類型如下:

類型            名稱              取值范圍(有符號,無符號)
TINYINT         最小整數      -128到127,0到255
SMALLINT        小整數            -32768到32767,0到65535
MEDIUMINT       中整數            -8388607到8388607,0到16777215
INT             整數        -2147483647到2147483647,0到4294967295
BIGINT          大整數            -9223372036854775807到9223372036854775807,0到18446744073709551615
decimal         十進制            
FLOAT           單精度浮點
DOUBAL          雙精度浮點

日期及時間型:

日期時間型用來記錄日期或時間,MySQL的日期時間類型如下:

類型                名稱                取值范圍
DATE                日期                '1000-01-01'到'9999-12-31'
TIME                時間                '-838:59:59'到'838:59:59'
DATETIME            日期時間             '1000-01-01 00:00:00'到'9999-12-31 23:59:59'
TIMESTAMP           時間戳         '1970-01-01 00:00:00'到’2037年某時'
YEAR                年                  4位格式:1901到2155,2位格式:1970-2069(70-69),或:0000 

自有類型:

自有類型是MySQL內置的類型,有兩種:

SET:字符串集合,事先給出多個元素(最多64個)供用戶選擇,用戶可以選多個元素填入
ENUM:枚舉,事先給出多個元素(最多65536個)供用戶選擇,用戶只能選一個元素填入

MySQL的SQL模式:

MySQL服務器可以以不同的SQL模式來操作,並且可以為不同客戶端應用不同模式。這樣每個應用程序可以根據自己的需求來定制服務器的操作模式。這類模式定義了MySQL應支持的SQL語法,以及應該在數據上執行何種確認檢查。這樣,就能在眾多不同的環境下、與其他數據庫服務器一起更容易地使用MySQL。MySQL常用的有三種SQL模式,傳統模式、嚴格模式和ANSI模式。MySQL的SQL模式默認為空,該模式為非嚴格模式。

可以通過如下命令查看MySQL當前的SQL模式:

mysql> SHOW GLOBAL VARIABLES LIKE 'sql_mode';
mysql> SELECT @@sql_mode;

設置MySQL的SQL模式:

mysql> SET [GLOBAL|SESSION] sql_mode='modes';

或啟動MySQL時指定SQL模式:

shell> mysqld --sql-mode="modes"

TRADITIONAL,傳統模式:

該模式的簡單描述是當在列中插入不正確的值時“給出錯誤而不是警告”。注釋:一旦發現錯誤立即放棄INSERT/UPDATE。如果你使用非事務存儲引擎,那么出現錯誤前進行的數據更改不會“回滾”,會導致結果更新“只進行了一部分”。

mysql> SET [GLOBAL|SESSION] sql_mode='TRADITIONAL';

STRICT,嚴格模式:

如果不能將給定的值插入到表中,則放棄該語句。嚴格模式具有兩種:STRICT_TRANS_TABLES和STRICT_ALL_TABLES。STRICT_TRANS_TABLES對支持事務的表實行嚴格模式,STRICT_ALL_TALBES在所有表執行嚴格模式。

mysql> SET [GLOBAL|SESSION] sql_mode='STRICT_TRANS_TABLES';
mysql> SET [GLOBAL|SESSION] sql_mode='STRICT_ALL_TABLES';

ANSI模式:

更改操作的語法和行為,使其更適合標准的SQL。

數據字典:

數據字典就類似於系統編目或花名冊(和目錄不太相同),它保存數據庫服務器上的元數據信息(數據庫的整體屬性信息)。元數據信息包括:關系(表)的名字、每個關系的各字段的名字、各字段的數據類型和長度約束、每個關系上的視圖的名字及視圖的定義、授權用戶的名字、用戶的授權和賬戶信息、統計類的數據:、每個關系字段的個數、每個關系中的行數、每個關系的存儲方法;

在mysql上保存元數據的數據庫有:mysql庫、infomation_schema庫、和performance_schema庫,performance_schema庫是一個虛擬的庫,類似於Linux的/proc等偽文件系統。

 

用戶變量

用戶變量是針對當前登錄MYSQL的用戶的私有變量,可以先在用戶變量中保存值然后在以后引用它;這樣可以將值從一個語句傳遞到另一個語句。

用戶變量與連接有關。也就是說,一個客戶端定義的變量不能被其它客戶端看到或使用。當客戶端退出時,該客戶端連接的所有變量將自動釋放。

用戶變量的形式為@var_name,其中變量名var_name可以由當前字符集的文字數字字符、‘.’、‘_’和

‘$’組成。 默認字符集是cp1252 (Latin1)。可以用mysqld的–default-character-set選項更改字符集

。用戶變量名對大小寫不敏感。

設置用戶變量的一個途徑是執行SET語句:

SET @var_name = expr [, @var_name = expr] ...

對於SET,可以使用=或:=作為分配符。分配給每個變量的expr可以為整數、實數、字符串或者NULL值。

也可以用語句(表達式)代替SET來為用戶變量分配一個值。在這種情況下,分配符必須為:=而不能用=,因為在非

SET語句中=被視為一個比較 操作符:

mysql> SET @t1=0, @t2=0, @t3=0; mysql> SELECT @t1:=(@t2:=1)+@t3:=4,@t1,@t2,@t3; +----------------------+------+------+------+ | @t1:=(@t2:=1)+@t3:=4 | @t1 | @t2 | @t3 | +----------------------+------+------+------+ | 5 | 5 | 1 | 4 | +----------------------+------+------+------+

用戶變量可以用於表達式中。目前不包括明顯需要文字值的上下文中,例如SELECT語句的LIMIT子句,或

者LOAD DATA語句的IGNORE number LINES子句。

如果使用沒有初始化的變量,其值是NULL。

如果用戶變量分配了一個字符串值,其字符集和校對規則與該字符串的相同。用戶變量的可壓縮性

(coercibility)是隱含的。(即為表列值的相同的可壓縮性(coercibility)。

注釋:在SELECT語句中,表達式發送到客戶端后才進行計算。這說明在HAVING、GROUP BY或者ORDER BY子

句中,不能使用包含SELECT列表中所設的變量的表達式。例如,下面的語句不能按期望工作:

mysql> SELECT (@aa:=id) AS a,(@aa+3) AS b tbl_name HAVING b=5

HAVING子句中引用了SELECT列表中的表達式的別名,使用@aa。不能按期望工作:@aa不包含當前行的值,

而是前面所選的行的id值。

一般原則是不要在語句的一個部分為用戶變量分配一個值而在同一語句的其它部分使用該變量。可能會得

到期望的結果,但不能保證。

設置變量並在同一語句中使用它的另一個問題是變量的默認結果的類型取決於語句前面的變量類型。下面

的例子說明了該點:

mysql> SET @a='test'; mysql> SELECT @a,(@a:=20) FROM tbl_name;

對於該 SELECT語句,MySQL向客戶端報告第1列是一個字符串,並且將@a的所有訪問轉換為字符串,即使

@a在第2行中設置為一個數字。執行完SELECT語句后,@a被視為下一語句的一個數字。

要想避免這種問題,要么不在同一個語句中設置並使用相同的變量,要么在使用前將變量設置為0、0.0或

者”以定義其類型。

未分配的變量有一個值NULL,類型為字符串。

系統變量

MySQL可以訪問許多系統和連接變量。當服務器運行時許多變量可以動態更改。這樣通常允許你修改服務

器操作而不需要停止並重啟服務器。

mysqld服務器維護兩種變量。全局變量影響服務器整體操作。會話變量影響具體客戶端連接的操作。

當服務器啟動時,它將所有全局變量初始化為默認值。這些默認值可以在選項文件中或在命令行中指定的

選項進行更改。服務器啟動后,通過連接服務器並執行SET GLOBAL var_name語句,可以動態更改這些全

局變量。要想更改全局變量,必須具有SUPER權限。

服務器還為每個連接的客戶端維護一系列會話變量。在連接時使用相應全局變量的當前值對客戶端的會話

變量進行初始化。對於動態會話變量,客戶端可以通過SET SESSION var_name語句更改它們。設置會話變

量不需要特殊權限,但客戶端只能更改自己的會話變量,而不能更改其它客戶端的會話變量。

對於全局變量的更改可以被訪問該全局變量的任何客戶端看見。然而,它只影響更改后連接的客戶的從該

全局變量初始化的相應會話變量。不影響目前已經連接的客戶端的會話變量(即使客戶端執行SET GLOBAL

語句也不影響)。

可以使用幾種語法形式來設置或檢索全局或會話變量。下面的例子使用了sort_buffer_sizeas作為示例變

量名。

要想設置一個GLOBAL變量的值,使用下面的語法:

mysql> SET GLOBAL sort_buffer_size=value; mysql> SET @@global.sort_buffer_size=value;

要想設置一個SESSION變量的值,使用下面的語法:

mysql> SHOW VARIABLES like 'sort_buffer_size'; mysql> SHOW SESSION VARIABLES like 'sort_buffer_size'; mysql> SELECT @@sort_buffer_size; mysql> SELECT @@session.sort_buffer_size;

LOCAL是SESSION的同義詞。

如果設置變量時不指定GLOBAL、SESSION或者LOCAL,默認使用SESSION。

要想檢索一個GLOBAL變量的值,使用下面的語法:

mysql> SHOW GLOBAL VARIABLES like 'sort_buffer_size';(可搜索多個變量 例如:SHOW GLOBAL VARIABLES like '%buffer%';) mysql> SELECT @@global.sort_buffer_size;(不能搜索多個變量 

要想檢索一個SESSION變量的值,使用下面的語法:

mysql> SHOW VARIABLES like 'sort_buffer_size';(可搜索多個變量 例如:SHOW VARIABLES like '%buffer%';) mysql> SHOW SESSION VARIABLES like 'sort_buffer_size'; mysql> SELECT @@sort_buffer_size; mysql> SELECT @@session.sort_buffer_size;

這里,LOCAL也是SESSION的同義詞。

當你用SELECT @@var_name搜索一個變量時(也就是說,不指定global.、session.或者local.),MySQL返

回SESSION值(如果存在),否則返回GLOBAL值。

對於SHOW VARIABLES,如果不指定GLOBAL、SESSION或者LOCAL,MySQL返回SESSION值。

當設置GLOBAL變量需要GLOBAL關鍵字但檢索時不需要它們的原因是防止將來出現問題。如果我們移除一個

與某個GLOBAL變量具有相同名字的SESSION變量,具有SUPER權限的客戶可能會意外地更改GLOBAL變量而不

是它自己的連接的SESSION變量。如果我們添加一個與某個GLOBAL變量具有相同名字的SESSION變量,想更

改GLOBAL變量的客戶可能會發現只有自己的SESSION變量被更改了。

全局變量小結:

①、無論是修改本次會話的變量還是全局變量,當mysql服務器重啟時,都會失效。要想永久生效,還是要將

配置寫入my.ini的配置文件的。
 
②>、對於全局變量的更改可以被訪問該全局變量的任何客戶端看見。然而,它只影響更改后連接的客戶的從該
全局變量初始化的相應會話變量。不影響目前已經連接的客戶端的會話變量(即使客戶端執行SET GLOBAL
語句也不影響)。簡而言之,全局變量修改后,客戶端必須重新連接才會生效。
 
③>、對於局部變量修改后,只會對本次連接生效,客戶端重新連接后失效


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM