MySQL数据库变量_数据库参数_MySQL变量_系统变量_用户变量
文章目錄
- MySQL 變量分類
- 系統(tǒng)變量
- 查看系統(tǒng)變量
- 設置系統(tǒng)變量
- 如何通過配置文件來設置變量值
- 通過命令行選項來設置變量值
- 動態(tài)設置全局級的系統(tǒng)變量
- 設置靜態(tài)的系統(tǒng)變量
- 設置會話級的系統(tǒng)變量
- 引用系統(tǒng)變量
- 總結
- 用戶自定義變量
- 用戶變量
- 聲明定義用戶變量
- 查看用戶變量的值
- 參考示例
- 使用命令 set 聲明定義會話級的用戶變量
- 使用 select 聲明定義會話級的用戶變量
- 使用 select into 語句聲明定義用戶變量
- 綜合示例
- 局部變量
- 聲明定義局部變量
- 局部變量的聲明
- 局部變量的賦值
- 局部變量的使用(查看、比較、運算等)
- 參考示例
- 用戶變量和局部變量的區(qū)別
- 狀態(tài)變量
- 注意
MySQL 變量分類
MySQL 通過變量來定義當前服務器的特性,保存狀態(tài)信息等。我們可以通過手動更改變量的值來配置MySQL,也可以通過變量獲得MySQL的當前狀態(tài)信息。
MySQL 的變量類型可以從多個維度來劃分:
1.從生效范圍來劃分可以分為全局變量(GLOBAL VARIABLES)和會話變量(SESSION VARIABLES)。
全局變量影響 MySQL 服務的整體運行方式和狀態(tài)的變量;會話變量是影響具體客戶端會話(一個數據庫連接產生一個會話)的操作方式及狀態(tài)的變量。
2.從變量的修改方式來劃分,可以分為動態(tài)變量和靜態(tài)變量。
動態(tài)變量是指在 MySQL 運行過程中,可以通過命令 set 隨時調整變量值的變量;靜態(tài)變量是指不能通過命令 set 隨時調整變量值,必須通過配置文件設置其值的變量。在配置文件中修改變量的值,必須重啟服務后才能生效。
3.從變量定義主體劃分,可以分為系統(tǒng)變量和用戶自定義變量。
3.1 系統(tǒng)變量就是系統(tǒng)已經定義好的變量,系統(tǒng)變量以 @@ 開頭。在系統(tǒng)變量中可以分為全局變量和會話變量。有些系統(tǒng)變量既是全局變量也是會話變量。特別注意,系統(tǒng)變量都是全局變量,絕對不存在只是會話變量的系統(tǒng)變量。
全局級的系統(tǒng)變量存在動態(tài)變量和靜態(tài)變量兩種;會話級的系統(tǒng)變量也存在動態(tài)變量和靜態(tài)變量兩種。并不是所有的會話變量都是可以使用命令 set 隨時修改其值的。
3.2 用戶自定義變量顧名思義就是用戶自己定義的變量,但是用戶自定義的變量中包含兩種變量:用戶變量、局部變量。
3.2.1 用戶變量是基于會話變量實現的,僅對當前連接會話有效,作用域等同于會話級的系統(tǒng)變量,所以用戶變量就是會話級的變量。用戶變量以 @ 開頭。
3.2.2 局部變量是使用 declare 關鍵字在 begin...end 語句塊中聲明定義的變量,其作用范圍在begin...end 語句塊中,離開這個語句塊則自動失效。
注意,在各種文檔中提到的用戶變量實際是指用戶自定義的會話級變量。用戶變量不存在全局的變量,換句話說用戶無法自定義全局性的變量。
MySQL 還有一種比較特殊的變量,這些通常用于監(jiān)控 MySQL 服務器的運行狀態(tài),可以使我們及時了解 MySQL 服務器的運行狀況,我們稱之為狀態(tài)變量,狀態(tài)變量也分為全局級和會話級。狀態(tài)變量可以使用 show status 語句查看,show status 也支持 like 匹配查詢。
系統(tǒng)變量
服務器維護著兩種系統(tǒng)變量,即全局變量和會話變量。每一個客戶端成功連接服務器后,都會產生與之對應的會話。會話期間,MySQL 服務實例會在服務器內存中生成與該會話對應的會話變量,這些會話變量的初始值是全局變量值的拷貝。
MySQL 中的系統(tǒng)變量以兩個“@”開頭:
1.@@global 僅僅用于標記全局變量;
2.@@session 僅僅用于標記會話變量;
3.@@ 首先標記會話變量,如果會話變量不存在,則標記全局變量。
查看系統(tǒng)變量
無論是在設置系統(tǒng)變量還是查詢系統(tǒng)變量值的時候,只要沒有指定到底是全局變量還是會話變量,都當做會話變量來處理。
在 shell 中使用命令 mysqladmin 查看所有的全局級的系統(tǒng)變量:
[root@htlwk0001host ~]# mysqladmin -uroot -p variables;或者連接數據庫后,通過命令 show 查看所有的系統(tǒng)變量:
mysql> show variables; # 不指定SESSION、GLOBAL、LOCAL,則優(yōu)先顯示會話級變量的值,如果沒有對應的會話級變量,則顯示全局級變量的值可以使用以下命令查看 MySQL 中所有的全局變量信息:
mysql> SHOW GLOBAL VARIABLES;可以使用以下命令查看與當前會話相關的所有會話變量:
mysql> SHOW SESSION VARIABLES;查看滿足條件的部分系統(tǒng)變量:
mysql> SHOW GLOBAL VARIABLES LIKE '%data_file_path%'; # 查看指定名稱的全局性的系統(tǒng)變量 mysql> SHOW SESSION VARIABLES LIKE '%innodb_data%'; # 查看指定名稱的會話級別的系統(tǒng)變量 mysql> SHOW VARIABLES LIKE '%data_file_%'; # 不指定關鍵詞,默認優(yōu)先顯示會話級的系統(tǒng)變量,沒有則顯示全局的系統(tǒng)變量查看指定的系統(tǒng)變量,可以在變量表中查詢:
mysql> SELECT * FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES WHERE VARIABLE_NAME='VARIABLE_NAME'; # 查詢全局的系統(tǒng)變量 mysql> SELECT * FROM INFORMATION_SCHEMA.SESSION_VARIABLES WHERE VARIABLE_NAME='VARIABLE_NAME'; # 查詢會話級別的系統(tǒng)變量查看指定的系統(tǒng)變量,也可以這樣查詢:
mysql> select @@global.sql_mode; # 查看指定的全局級的系統(tǒng)變量 mysql> select @@session.sql_mode; # 查看指定的會話級的系統(tǒng)變量 mysql> select @@sql_mode; # 不指定關鍵詞,默認查詢的是會話級別的系統(tǒng)變量,如果不存在會員級的變量,則會查詢對應的全局級的變量的值查看數據庫服務器所有的靜態(tài)變量(即狀態(tài)變量):
mysql> show status;設置系統(tǒng)變量
當服務器啟動時,會將所有全局變量初始化為默認值。這些默認值可以在選項文件中或在命令行中指定的選項進行更改。
可以通過以下方法設置系統(tǒng)變量:
修改 MySQL 源代碼,然后對 MySQL 源代碼重新編譯(該方法適用于 MySQL 高級用戶,這里不做闡述)。
在 MySQL 配置文件(mysql.ini 或 mysql.cnf 或 my.cnf)中修改 MySQL 系統(tǒng)變量的值(需要重啟 MySQL 服務才會生效)。
在 MySQL 服務運行期間,使用 SET 命令重新設置系統(tǒng)變量的值。
如何通過配置文件來設置變量值
以變量 local_infile 的設置為例,在命令終端使用 vim 打開配置文件進行編輯:
[root@htlwk0001host ~]# vim /etc/my.cnf在其中的 [mysqld] 下面添加如下內容:
local-infile=ON # 能不能寫成 local_infile=ON,我不知道,沒有試過說明:
1.表示開啟,其值可以設置為 ON 或 TRUE 或 1 都可以;表示關閉其值可以設置為 OFF 或 FALSE 或 0 都可以
2.通過配置文件設置的參數值必須重啟數據庫服務才能生效,并且是永久生效
通過命令行選項來設置變量值
mysqld --max_connections=200動態(tài)設置全局級的系統(tǒng)變量
更改全局變量,必須具有 SUPER 權限。設置全局變量的值的方法如下:
mysql> SET @@global.innodb_file_per_table=default; mysql> SET @@global.innodb_file_per_table=ON; mysql> SET global innodb_file_per_table=ON;注:
1.給全局性的系統(tǒng)變量賦值,必須寫關鍵詞 global,不寫默認是給會話級的系統(tǒng)變量賦值,如果不存在對應的會話級變量則會報錯
2.表示某種功能特性開啟還是關閉的變量,其值設置為 ON 或 TRUE 或 1 都可以表示開啟;設置為 OFF 或 FALSE 或 0 都可以表示關閉
3.更改全局變量只影響更改后連接客戶端的相應會話變量,而不會影響目前已經連接的客戶端的會話變量(即使客戶端執(zhí)行 SET GLOBAL 語句也不影響)。也就是說,對于修改全局變量之前連接的客戶端只有在客戶端重新連接后,才會影響到客戶端。簡而言之,全局變量修改后,客戶端必須重新連接才會生效
4.使用 SET 設置全局變量成功后,如果 MySQL 服務重啟,數據庫的配置會重新初始化,一切按照配置文件進行初始化,因此數據庫服務重啟后全局變量的配置會失效
設置靜態(tài)的系統(tǒng)變量
MySQL 中還有一些特殊的系統(tǒng)變量,如 log_bin、tmpdir、version、datadir,在 MySQL 服務實例運行期間它們的值不能動態(tài)修改,也就是不能使用 SET 命令進行重新設置,這種變量稱為靜態(tài)變量。數據庫管理員可以使用前面提到的修改源代碼或更改配置文件來重新設置靜態(tài)變量的值。
設置會話級的系統(tǒng)變量
服務器還為每個連接的客戶端維護一系列會話變量。在連接時使用相應全局變量的當前值對客戶端的會話變量進行初始化。設置會話變量不需要特殊權限,但客戶端只能更改自己的會話變量,而不能更改其它客戶端的會話變量。設置會話變量的值的方法如下:
mysql> SET @@session.pseudo_thread_id=5; # 如果不存在此會話級的系統(tǒng)變量會報錯 mysql> SET session pseudo_thread_id=5; # 如果不存在此會話級的系統(tǒng)變量會報錯 mysql> SET @@pseudo_thread_id=5; # 默認設置的是會話系統(tǒng)變量,如果pseudo_thread_id是全局變量,不是會話級的變量,這樣賦值會報錯,當然如果根本不存在此變量,也會報錯 mysql> SET pseudo_thread_id = 5; # 默認設置的是會話系統(tǒng)變量,如果pseudo_thread_id是全局變量,不存在對應的會話變量,這樣賦值會報錯,當然如果根本不存在此變量,也會報錯注:
1.會話變量的配置在當前會話退出后就失效了,會話斷開即失效。
2.LOCAL 是 SESSION 的同義詞,所以 SESSION 可以替換成 LOCAL
3.不指定 SESSION 或 GLOBAL 或 LOCAL 默認是 SESSION
引用系統(tǒng)變量
@@GLOBAL.var_name @@SESSION.var_name @@LOCAL.var_name @@var_name # 沒有指定級別限定符,默認優(yōu)先獲取會話級的系統(tǒng)變量的值總結
不論使用哪種方式查看或者獲取系統(tǒng)變量的值,如果沒有指定級別限定符,優(yōu)先顯示或獲取會話變量的值;同樣的,賦值的時候如果沒有指定級別限定符,默認是給會話變量賦值,但是如果不存在該會話變量則會報錯。
用戶自定義變量
用戶自定義變量分為用戶自定義的會話變量(即用戶變量)和局部變量。
用戶變量
用戶變量和會話級的系統(tǒng)變量類似,與連接會話有關,是針對當前登錄數據庫的會話的變量;也就是說,用戶在一個客戶端定義的變量不能被其它客戶端看到或使用。當客戶端退出時,該客戶端連接的所有的會話變量將自動釋放。
用戶變量的作用:
可以先在用戶變量中保存值然后在后面的命令語句中引用它。這樣可以將值從一個語句傳遞到另一個語句。
用戶變量表示形式:
系統(tǒng)變量都是以 @@ 開頭,用戶自定義的會話變量以 @ 開頭,例如:@var_name,其中變量名可以由當前字符集的英文、數字、.、_ 和 $ 組成。 默認字符集是 cp1252 (Latin1)。可以用mysqld 的 --default-character-set 選項更改字符集。用戶變量名對大小寫不敏感。
聲明定義用戶變量
/*方式1*/ mysql> set @變量名=值; /*方式2*/ mysql> set @變量名:=值; /*方式3*/ mysql> select @變量名:=值; /*方式4*/ mysql> select 字段 into @變量名 from 表;注:用戶變量的賦值和變量的聲明一模一樣。
查看用戶變量的值
mysql> select @var_name;注:show 命令只能查看系統(tǒng)變量的值,不能查看用戶變量的值。
參考示例
使用命令 set 聲明定義會話級的用戶變量
使用命令 set 定義會話級的用戶變量,定義形式是以 @ 開始,如:@var_name。分配符可以使用 = 或者 := 。未分配的用戶變量有一個默認值 NULL,類型為字符串。
mysql> SET @t1=0, @t2=1, @t3='hello'; # 聲明定義多個用戶變量,字符串必須使用單引號或者雙引號引起來 Query OK, 0 rows affected (0.00 sec)mysql> select @t1,@t2,@t3; +------+------+------+ | @t1 | @t2 | @t3 | +------+------+------+ | 0 | 1 | hello| +------+------+------+ 1 row in set (0.00 sec)使用 select 聲明定義會話級的用戶變量
使用 select 定義用戶變量或者賦值,分配符必須為 := 而不能用 =,因為在非 set 語句中 = 被視為一個比較操作符。
mysql> SELECT @t1:=(@t2:=1)+@t3:=4,@t1,@t2,@t3; +----------------------+------+------+------+ | @t1:=(@t2:=1)+@t3:=4 | @t1 | @t2 | @t3 | +----------------------+------+------+------+ | 5 | 5 | 1 | 4 | +----------------------+------+------+------+使用 select into 語句聲明定義用戶變量
mysql> select name into @name from student; # “select name”這個name的返回值必須只有一個才能給變量@name賦值,否則報錯 ERROR 1172 (42000): Result consisted of more than one row mysql> select name into @name from student where id=00000000000000000001; Query OK, 1 row affected (0.00 sec)mysql> select @name; +--------------+ | @name | +--------------+ | liaowenxiong | +--------------+ 1 row in set (0.00 sec)綜合示例
/*select :=方式創(chuàng)建變量*/ mysql> select @first_name:='路人甲Java',@email:='javacode2018@163.com'; /*使用變量*/ mysql> insert into employees (first_name,email) values (@first_name,@email);局部變量
局部變量是在 begin...end 語句塊中使用關鍵字 declare 聲明定義的變量。
聲明定義局部變量
在存儲過程和函數中通過 declare 關鍵字在 BEGIN...END 語句塊中聲明定義局部變量,在 END 后變量無效。
注意:
1.declare 定義的變量名不能帶 @ 符號。
2.聲明局部變量必須要指定變量的類型。
3.聲明在 begin...end 中的第一句話
局部變量的聲明
mysql> declare var_name 類型; # 僅聲明了變量 mysql> declare var_name 類型 default 值; # 聲明變量且定義了變量的初始值局部變量的賦值
方法一:
mysql> set var_name = value; mysql> set var_name := value;方法二:
mysql> select var_name := value; mysql> select field_name into var_name from table_name;局部變量的使用(查看、比較、運算等)
mysql> select var_name;參考示例
示例一:
DELIMITER $$ -- 聲明定界符號為$$DROP PROCEDURE IF EXISTS insert_ten_rows $$CREATE PROCEDURE insert_ten_rows () BEGINDECLARE crs INT DEFAULT 0; # 聲明定義局部變量crsWHILE crs < 10 DOINSERT INTO `continent`(`name`) VALUES ('cont'+crs);SET crs = crs + 1; # 局部變量賦值END WHILE;END $$DELIMITER ; -- 聲明定界符為分號 CALL insert_ten_rows(); -- 調用存儲過程,使用分號結尾示例二:
/*創(chuàng)建表test1*/ drop table IF EXISTS test1; create table test1(a int PRIMARY KEY,b int);/*聲明腳本的結束符為$$*/ DELIMITER $$ DROP PROCEDURE IF EXISTS proc1; CREATE PROCEDURE proc1() BEGIN/*聲明了一個局部變量*/DECLARE v_a int;select ifnull(max(a),0)+1 into v_a from test1;select @v_b:=v_a*2;insert into test1(a,b) select v_a,@v_b; end $$/*聲明腳本的結束符為;*/ DELIMITER ;/*調用存儲過程*/ call proc1(); /*查看結果*/ select * from test1;用戶變量和局部變量的區(qū)別
1.用戶變量必須以"@"開頭的;局部變量沒有這個符號
2.聲明局部變量必須指定數據類型,用戶變量不需要
3.作用范圍不同,用戶變量在整個連接會話中的任何地方都可以引用,局部變量只在 begin...end 語句塊內有效,離開 begin...end 語句塊則失效
狀態(tài)變量
Server Status Variables(服務器狀態(tài)變量)
MySQL狀態(tài)變量(Server Status Variables)是當前服務器從啟動后累計的一些系統(tǒng)狀態(tài)信息,例如最大連接數,累計的中斷連接等等,主要用于評估當前系統(tǒng)資源的使用情況以進一步分析系統(tǒng)性能而做出相應的調整決策。這個估計有人會跟常規(guī)的系統(tǒng)變量混淆,其實狀態(tài)變量是動態(tài)變化的,另外,狀態(tài)變量是只讀的:只能由MySQL服務器本身設置和修改,對于用戶來說是只讀的,不可以通過SET語句設置和修改它們,而系統(tǒng)變量則可以隨時修改。狀態(tài)變量也分為會話級與全局級別狀態(tài)信息。有些狀態(tài)變量可以用FLUSH STATUS語句重置為零值。
注意
MySQL 5.7 以后系統(tǒng)變量和狀態(tài)變量需要從數據庫 performance_schema 中進行獲取,數據庫 information_schema 仍然保留了GLOBAL_STATUS,GLOBAL_VARIABLES 兩個表做兼容,如果希望沿用在數據庫 information_schema 中進行查詢的習慣,MySQL5.7 提供了參數 show_compatibility_56,參數值設置為 ON 可以兼容 MySQL 5.7 之前的用法,否則就會報錯(ERROR 3167 (HY000))
總結
以上是生活随笔為你收集整理的MySQL数据库变量_数据库参数_MySQL变量_系统变量_用户变量的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 国内电脑端软件下载站在电脑上如何下载软件
- 下一篇: Linux系统下MySQL的导出数据语句