mysql $gt_mysql变量(用户+系统)
9.3.?用戶變量
可以先在用戶變量中保存值然后在以后引用它;這樣可以將值從一個(gè)語句傳遞到另一個(gè)語句。用戶變量與連接有關(guān)。也就是說,一個(gè)客戶端定義的變量不能被其它客戶端看到或使用。當(dāng)客戶端退出時(shí),該客戶端連接的所有變量將自動(dòng)釋放。
用戶變量的形式為@var_name,其中變量名var_name可以由當(dāng)前字符集的文字?jǐn)?shù)字字符、‘.’、‘_’和‘$’組成。?默認(rèn)字符集是cp1252?(Latin1)。可以用mysqld的--default-character-set選項(xiàng)更改字符集。參見5.10.1節(jié),“數(shù)據(jù)和排序用字符集”。用戶變量名對(duì)大小寫不敏感。
設(shè)置用戶變量的一個(gè)途徑是執(zhí)行SET語句:
SET?@var_name?=?expr?[,?@var_name?=?expr]?...對(duì)于SET,可以使用=或:=作為分配符。分配給每個(gè)變量的expr可以為整數(shù)、實(shí)數(shù)、字符串或者NULL值。
也可以用語句代替SET來為用戶變量分配一個(gè)值。在這種情況下,分配符必須為:=而不能用=,因?yàn)樵诜荢ET語句中=被視為一個(gè)比較?操作符:
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?|+----------------------+------+------+------+ 用戶變量可以用于表達(dá)式中。目前不包括明顯需要文字值的上下文中,例如SELECT語句的LIMIT子句,或者LOAD?DATA語句的 IGNORE?number?LINES子句。
如果使用沒有初始化的變量,其值是NULL。
如果用戶變量分配了一個(gè)字符串值,其字符集和校對(duì)規(guī)則與該字符串的相同。用戶變量的可壓縮性(coercibility)是隱含的。(即為表列值的相同的可壓縮性(coercibility)。
注釋:在SELECT語句中,表達(dá)式發(fā)送到客戶端后才進(jìn)行計(jì)算。這說明在HAVING、GROUP?BY或者ORDER?BY子句中,不能使用包含SELECT列表中所設(shè)的變量的表達(dá)式。例如,下面的語句不能按期望工作:
mysql>?SELECT?(@aa:=id)?AS?a, (@aa+3)?AS?b?從tbl_name?HAVING?b=5;HAVING子句中引用了SELECT列表中的表達(dá)式的別名,使用@aa。不能按 期望工作:@aa不包含當(dāng)前行的值,而是前面所選的行的id值。
一般原則是不要在語句的一個(gè)部分為用戶變量分配一個(gè)值而在同一語句的其它部分使用該變量。可能會(huì)得到期望的結(jié)果,但不能保證。
設(shè)置變量并在同一語句中使用它的另一個(gè)問題是變量的默認(rèn)結(jié)果的類型取決于語句前面的變量類型。下面的例子說明了該點(diǎn):
mysql>?SET?@a='test';mysql>?SELECT?@a, (@a:=20)?FROM?tbl_name;對(duì)于該?SELECT語句,MySQL向客戶端報(bào)告第1列是一個(gè)字符串,并且將@a的所有訪問轉(zhuǎn)換為字符 串,即使@a在第2行中設(shè)置為一個(gè)數(shù)字。執(zhí)行完SELECT語句后,@a被視為下一語句的一個(gè)數(shù)字。
要想避免這種問題,要么不在同一個(gè)語句中設(shè)置并使用相同的變量,要么在使用前將變量設(shè)置為0、0.0或者''以定義其類型。
未分配的變量有一個(gè)值NULL,類型為字符串。
9.4.?系統(tǒng)變量
9.4.1.?結(jié)構(gòu)式系統(tǒng)變量
MySQL可以訪問許多系統(tǒng)和連接變量。當(dāng)服務(wù)器運(yùn)行時(shí)許多變量可以動(dòng)態(tài)更改。這樣通常允許你修改服務(wù)器操作而不需要停止并重啟服務(wù)器。
mysqld服務(wù)器維護(hù)兩種變量。全局變量影響服務(wù)器整體操作。會(huì)話變量影響具體客戶端連接的操作。
當(dāng)服務(wù)器啟動(dòng)時(shí),它將所有全局變量初始化為默認(rèn)值。這些默認(rèn)值可以在選項(xiàng)文件中或在命令行中指定的選項(xiàng)進(jìn)行更改。服務(wù)器啟動(dòng)后,通過連接服務(wù)器并執(zhí)行SET?GLOBAL?var_name語句,可以動(dòng)態(tài)更改這些全局變量。要想更改全局變量,必須具有SUPER權(quán)限。
服 務(wù)器還為每個(gè)連接的客戶端維護(hù)一系列會(huì)話變量。在連接時(shí)使用相應(yīng)全局變量的當(dāng)前值對(duì)客戶端的會(huì)話變量進(jìn)行初始化。對(duì)于動(dòng)態(tài)會(huì)話變量,客戶端可以通過 SET?SESSION?var_name語句更改它們。設(shè)置會(huì)話變量不需要特殊權(quán)限,但客戶端只能更改自己的會(huì)話變量,而不能更改其它客戶端的會(huì)話變 量。
對(duì)于全局變量的更改可以被訪問該全局變量的任何客戶端看見。然而,它只影響更改后連接的客戶的從該全局變量初始化的相應(yīng)會(huì)話變量。不影響目前已經(jīng)連接的客戶端的會(huì)話變量(即使客戶端執(zhí)行SET?GLOBAL語句也不影響)。
可以使用幾種語法形式來設(shè)置或檢索全局或會(huì)話變量。下面的例子使用了sort_buffer_sizeas作為示例變量名。
要想設(shè)置一個(gè)GLOBAL變量的值,使用下面的語法:
mysql>?SET?GLOBAL?sort_buffer_size=value;mysql>?SET?@@global.sort_buffer_size=value;要想設(shè)置一個(gè)SESSION變量的值,使用下面的語法:
mysql>?SET?SESSION?sort_buffer_size=value; mysql>?SET?@@session.sort_buffer_size=value;mysql& gt;?SET?sort_buffer_size=value;LOCAL是SESSION的同義詞。
如果設(shè)置變量時(shí)不指定GLOBAL、SESSION或者LOCAL,默認(rèn)使用SESSION。參見13.5.3節(jié),“SET語法”。
要想檢索一個(gè)GLOBAL變量的值,使用下面的語法:
mysql>?SELECT?@@global.sort_buffer_size;mysql>?SHOW?GLOBAL?VARIABLES?like?'sort_buffer_size';要想檢索一個(gè)SESSION變量的值,使用下面的語法:
mysql>?SELECT?@@sort_buffer_size;mysql>?SELECT?@@session.sort_buffer_size;mysql>?SHOW?SESSION?VARIABLES?like?'sort_buffer_size';這里,LOCAL也是SESSION的同義詞。
當(dāng)你用SELECT?@@var_name搜索一個(gè)變量時(shí)(也就是說,不指定global.、session.或者local.),MySQL返回SESSION值(如果存在),否則返回GLOBAL值。
對(duì)于SHOW?VARIABLES,如果不指定GLOBAL、SESSION或者LOCAL,MySQL返回SESSION值。
當(dāng) 設(shè)置GLOBAL變量需要GLOBAL關(guān)鍵字但檢索時(shí)不需要它們的原因是防止將來出現(xiàn)問題。如果我們移除一個(gè)與某個(gè)GLOBAL變量具有相同名字的 SESSION變量,具有SUPER權(quán)限的客戶可能會(huì)意外地更改GLOBAL變量而不是它自己的連接的SESSION變量。如果我們添加一個(gè)與某個(gè) GLOBAL變量具有相同名字的SESSION變量,想更改GLOBAL變量的客戶可能會(huì)發(fā)現(xiàn)只有自己的SESSION變量被更改了。
關(guān)于系統(tǒng)啟動(dòng)選項(xiàng)和系統(tǒng)變量的詳細(xì)信息參見5.3.1節(jié),“mysqld命令行選項(xiàng)”和5.3.3節(jié),“服務(wù)器系統(tǒng)變量”。在5.3.3.1節(jié),“動(dòng)態(tài)系統(tǒng)變量”中列出了可以在運(yùn)行時(shí)設(shè)置的變量。
9.4.1.?結(jié)構(gòu)式系統(tǒng)變量
結(jié)構(gòu)式變量在兩個(gè)方面不同于常規(guī)系統(tǒng)變量:
·?????????其值是一個(gè)含組件的結(jié)構(gòu),可以指定服務(wù)器參數(shù),一般緊密相關(guān)。
·?????????可能是給定類型的結(jié)構(gòu)式變量的幾個(gè)實(shí)例。每個(gè)實(shí)例有一個(gè)不同的名,指向服務(wù)器維護(hù)的不同的資源。
MySQL?5.1支持結(jié)構(gòu)式變量類型,可以指定監(jiān)控鍵值緩存操作的參數(shù)。鍵值緩存結(jié)構(gòu)式變量有以下組件:
·?????????key_buffer_size
·?????????key_cache_block_size
·?????????key_cache_division_limit
·?????????key_cache_age_threshold
該節(jié)描述了引用結(jié)構(gòu)式變量的語法。在語法的例子中使用了鍵值緩存變量,但關(guān)于鍵值緩存如何操作的具體詳情在其它章節(jié)中,如?7.4.6節(jié),“MyISAM鍵高速緩沖”。
要引用結(jié)構(gòu)式變量實(shí)例的組件,可以使用instance_name.component_name格式的復(fù)合名。例如:
hot_cache.key_buffer_sizehot_cache.key_cache_block_sizecold_cache.key_cache_block_size對(duì)于每個(gè)結(jié)構(gòu)式系統(tǒng)變量,總是預(yù)定義名為default的一個(gè)實(shí)例。如果不使用任何實(shí)例名引用結(jié)構(gòu)式變量的一個(gè)組件,default實(shí)例被使用。這樣,default.key_buffer_size和key_buffer_sizeboth均指向同一系統(tǒng)變量。
結(jié)構(gòu)式變量實(shí)例和組件的命名規(guī)則為:
·?????????對(duì)于給定類型的結(jié)構(gòu)式變量,每個(gè)實(shí)例必須有一個(gè)在該類變量中唯一的一個(gè)名。但是,在不同類型的結(jié)構(gòu)式變量中實(shí)例名不需要唯一。例如,每個(gè)結(jié)構(gòu)式變量有一個(gè)實(shí)例default,因此在不同的變量類型中default不是唯一的。
·?????????每個(gè)結(jié)構(gòu)式變量類型的組件名在所有系統(tǒng)變量名中必須是唯一的。如果不是這樣(也就是說,如果兩個(gè)不同類型的結(jié)構(gòu)式變量能夠共享組件成員名),將不清楚使用哪個(gè)默認(rèn)結(jié)構(gòu)式變量來用作沒有使用實(shí)例名限定的成員名。
·?????????如果結(jié)構(gòu)式變量實(shí)例名作為未引起來的識(shí)別符不合法,將它用反勾號(hào)引起來作為識(shí)別符。例如,hot-cache不合法,但`hot-cache`?合法。
·?????????global、session和local不是合法實(shí)例名。這樣可以避免與引用非結(jié)構(gòu)式系統(tǒng)變量的符號(hào)的沖突,例如@@global.var_name。
目前,這前兩個(gè)規(guī)則不可能違背,因?yàn)槲ㄒ坏慕Y(jié)構(gòu)式變量類型是鍵值緩存。在將來創(chuàng)建其它類型的結(jié)構(gòu)式變量,這些規(guī)則將有重要的意義。
一個(gè)例外是,可以在可能出現(xiàn)簡(jiǎn)單變量名的上下文中使用復(fù)合名引用結(jié)構(gòu)式變量組件。例如,可以使用一個(gè)命令行選項(xiàng)未某個(gè)結(jié)構(gòu)式變量分配一個(gè)值:
shell>?mysqld?--hot_cache.key_buffer_size=64K在選項(xiàng)文件中,使用:
[mysqld]hot_cache.key_buffer_size=64K如果用該選項(xiàng)啟動(dòng)服務(wù)器,除了默認(rèn)大小為8MB的默認(rèn)鍵值緩存,還創(chuàng)建一個(gè)名為hot_cache的鍵值緩存,大小為64KB。
假定你這樣啟動(dòng)服務(wù)器:
shell>?mysqld?--key_buffer_size=256K?/?????????--extra_cache.key_buffer_size=128K?/?????????--extra_cache.key_cache_block_size=2048 在這種情況下,服務(wù)器將默認(rèn)鍵值緩存的大小設(shè)定為256KB。(也可以寫成--default.key_buffer_size=256K)。?并且,服務(wù)器創(chuàng)建一個(gè)名為extra_cache的第2個(gè)鍵值緩存,大小為128KB,緩存表索引塊的塊緩存區(qū)的大小設(shè)置為2048字節(jié)。
在下面的例子中,用3個(gè)不同的鍵值緩存(大小比例為3:1:1)啟動(dòng)服務(wù)器:
shell>?mysqld?--key_buffer_size=6M?/?????????--hot_cache.key_buffer_size=2M?/?????????--cold_cache.key_buffer_size=2M 也可以在運(yùn)行時(shí)設(shè)置和檢索結(jié)構(gòu)式變量值。例如,要想將名為hot_cache的一個(gè)鍵值緩存的大小設(shè)置為10MB,使用下面任何一個(gè)語句:
mysql>?SET?GLOBAL?hot_cache.key_buffer_size?=?10*1024*1024; mysql>?SET?@@global.hot_cache.key_buffer_size?=?10*1024*1024;要想檢索緩存大 小,執(zhí)行:
mysql>?SELECT?@@global.hot_cache.key_buffer_size;但是,下面的語句不工作。變量不解釋為一個(gè)復(fù)合名,而是解釋為L(zhǎng)IKE模式匹配操作的簡(jiǎn)單字符串:
mysql>?SHOW?GLOBAL?VARIABLES?LIKE?'hot_cache.key_buffer_size';這是一個(gè)在可能出現(xiàn)簡(jiǎn)單的變量名時(shí)使用結(jié)構(gòu)式變量名的例子。
總結(jié)
以上是生活随笔為你收集整理的mysql $gt_mysql变量(用户+系统)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 今日春分:春节第四个节气来了 4000多
- 下一篇: 长安汽车:今年推进深蓝 200 家以上仓