日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

MySQL数据库变量_数据库参数_MySQL变量_系统变量_用户变量

發(fā)布時(shí)間:2023/12/3 数据库 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MySQL数据库变量_数据库参数_MySQL变量_系统变量_用户变量 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • MySQL 變量分類
  • 系統(tǒng)變量
    • 查看系統(tǒng)變量
    • 設(shè)置系統(tǒng)變量
      • 如何通過配置文件來設(shè)置變量值
      • 通過命令行選項(xiàng)來設(shè)置變量值
    • 動(dòng)態(tài)設(shè)置全局級(jí)的系統(tǒng)變量
    • 設(shè)置靜態(tài)的系統(tǒng)變量
    • 設(shè)置會(huì)話級(jí)的系統(tǒng)變量
    • 引用系統(tǒng)變量
    • 總結(jié)
  • 用戶自定義變量
    • 用戶變量
      • 聲明定義用戶變量
      • 查看用戶變量的值
      • 參考示例
        • 使用命令 set 聲明定義會(huì)話級(jí)的用戶變量
        • 使用 select 聲明定義會(huì)話級(jí)的用戶變量
        • 使用 select into 語(yǔ)句聲明定義用戶變量
        • 綜合示例
    • 局部變量
      • 聲明定義局部變量
      • 局部變量的聲明
      • 局部變量的賦值
      • 局部變量的使用(查看、比較、運(yùn)算等)
      • 參考示例
    • 用戶變量和局部變量的區(qū)別
  • 狀態(tài)變量
  • 注意

MySQL 變量分類

MySQL 通過變量來定義當(dāng)前服務(wù)器的特性,保存狀態(tài)信息等。我們可以通過手動(dòng)更改變量的值來配置MySQL,也可以通過變量獲得MySQL的當(dāng)前狀態(tài)信息。

MySQL 的變量類型可以從多個(gè)維度來劃分:

1.從生效范圍來劃分可以分為全局變量(GLOBAL VARIABLES)和會(huì)話變量(SESSION VARIABLES)。
全局變量影響 MySQL 服務(wù)的整體運(yùn)行方式和狀態(tài)的變量;會(huì)話變量是影響具體客戶端會(huì)話(一個(gè)數(shù)據(jù)庫(kù)連接產(chǎn)生一個(gè)會(huì)話)的操作方式及狀態(tài)的變量。

2.從變量的修改方式來劃分,可以分為動(dòng)態(tài)變量和靜態(tài)變量。

動(dòng)態(tài)變量是指在 MySQL 運(yùn)行過程中,可以通過命令 set 隨時(shí)調(diào)整變量值的變量;靜態(tài)變量是指不能通過命令 set 隨時(shí)調(diào)整變量值,必須通過配置文件設(shè)置其值的變量。在配置文件中修改變量的值,必須重啟服務(wù)后才能生效。

3.從變量定義主體劃分,可以分為系統(tǒng)變量和用戶自定義變量。

3.1 系統(tǒng)變量就是系統(tǒng)已經(jīng)定義好的變量,系統(tǒng)變量以 @@ 開頭。在系統(tǒng)變量中可以分為全局變量和會(huì)話變量。有些系統(tǒng)變量既是全局變量也是會(huì)話變量。特別注意,系統(tǒng)變量都是全局變量,絕對(duì)不存在只是會(huì)話變量的系統(tǒng)變量。

全局級(jí)的系統(tǒng)變量存在動(dòng)態(tài)變量和靜態(tài)變量?jī)煞N;會(huì)話級(jí)的系統(tǒng)變量也存在動(dòng)態(tài)變量和靜態(tài)變量?jī)煞N。并不是所有的會(huì)話變量都是可以使用命令 set 隨時(shí)修改其值的。

3.2 用戶自定義變量顧名思義就是用戶自己定義的變量,但是用戶自定義的變量中包含兩種變量:用戶變量、局部變量。

3.2.1 用戶變量是基于會(huì)話變量實(shí)現(xiàn)的,僅對(duì)當(dāng)前連接會(huì)話有效,作用域等同于會(huì)話級(jí)的系統(tǒng)變量,所以用戶變量就是會(huì)話級(jí)的變量。用戶變量以 @ 開頭。

3.2.2 局部變量是使用 declare 關(guān)鍵字在 begin...end 語(yǔ)句塊中聲明定義的變量,其作用范圍在begin...end 語(yǔ)句塊中,離開這個(gè)語(yǔ)句塊則自動(dòng)失效。

注意,在各種文檔中提到的用戶變量實(shí)際是指用戶自定義的會(huì)話級(jí)變量。用戶變量不存在全局的變量,換句話說用戶無法自定義全局性的變量。

MySQL 還有一種比較特殊的變量,這些通常用于監(jiān)控 MySQL 服務(wù)器的運(yùn)行狀態(tài),可以使我們及時(shí)了解 MySQL 服務(wù)器的運(yùn)行狀況,我們稱之為狀態(tài)變量,狀態(tài)變量也分為全局級(jí)和會(huì)話級(jí)。狀態(tài)變量可以使用 show status 語(yǔ)句查看,show status 也支持 like 匹配查詢。

系統(tǒng)變量

服務(wù)器維護(hù)著兩種系統(tǒng)變量,即全局變量和會(huì)話變量。每一個(gè)客戶端成功連接服務(wù)器后,都會(huì)產(chǎn)生與之對(duì)應(yīng)的會(huì)話。會(huì)話期間,MySQL 服務(wù)實(shí)例會(huì)在服務(wù)器內(nèi)存中生成與該會(huì)話對(duì)應(yīng)的會(huì)話變量,這些會(huì)話變量的初始值是全局變量值的拷貝。

MySQL 中的系統(tǒng)變量以兩個(gè)“@”開頭:

1.@@global 僅僅用于標(biāo)記全局變量;
2.@@session 僅僅用于標(biāo)記會(huì)話變量;
3.@@ 首先標(biāo)記會(huì)話變量,如果會(huì)話變量不存在,則標(biāo)記全局變量。

查看系統(tǒng)變量

無論是在設(shè)置系統(tǒng)變量還是查詢系統(tǒng)變量值的時(shí)候,只要沒有指定到底是全局變量還是會(huì)話變量,都當(dāng)做會(huì)話變量來處理。

在 shell 中使用命令 mysqladmin 查看所有的全局級(jí)的系統(tǒng)變量:

[root@htlwk0001host ~]# mysqladmin -uroot -p variables;

或者連接數(shù)據(jù)庫(kù)后,通過命令 show 查看所有的系統(tǒng)變量:

mysql> show variables; # 不指定SESSION、GLOBAL、LOCAL,則優(yōu)先顯示會(huì)話級(jí)變量的值,如果沒有對(duì)應(yīng)的會(huì)話級(jí)變量,則顯示全局級(jí)變量的值

可以使用以下命令查看 MySQL 中所有的全局變量信息:

mysql> SHOW GLOBAL VARIABLES;

可以使用以下命令查看與當(dāng)前會(huì)話相關(guān)的所有會(huì)話變量:

mysql> SHOW SESSION VARIABLES;

查看滿足條件的部分系統(tǒng)變量:

mysql> SHOW GLOBAL VARIABLES LIKE '%data_file_path%'; # 查看指定名稱的全局性的系統(tǒng)變量 mysql> SHOW SESSION VARIABLES LIKE '%innodb_data%'; # 查看指定名稱的會(huì)話級(jí)別的系統(tǒng)變量 mysql> SHOW VARIABLES LIKE '%data_file_%'; # 不指定關(guān)鍵詞,默認(rèn)優(yōu)先顯示會(huì)話級(jí)的系統(tǒng)變量,沒有則顯示全局的系統(tǒng)變量

查看指定的系統(tǒng)變量,可以在變量表中查詢:

mysql> SELECT * FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES WHERE VARIABLE_NAME='VARIABLE_NAME'; # 查詢?nèi)值南到y(tǒng)變量 mysql> SELECT * FROM INFORMATION_SCHEMA.SESSION_VARIABLES WHERE VARIABLE_NAME='VARIABLE_NAME'; # 查詢會(huì)話級(jí)別的系統(tǒng)變量

查看指定的系統(tǒng)變量,也可以這樣查詢:

mysql> select @@global.sql_mode; # 查看指定的全局級(jí)的系統(tǒng)變量 mysql> select @@session.sql_mode; # 查看指定的會(huì)話級(jí)的系統(tǒng)變量 mysql> select @@sql_mode; # 不指定關(guān)鍵詞,默認(rèn)查詢的是會(huì)話級(jí)別的系統(tǒng)變量,如果不存在會(huì)員級(jí)的變量,則會(huì)查詢對(duì)應(yīng)的全局級(jí)的變量的值

查看數(shù)據(jù)庫(kù)服務(wù)器所有的靜態(tài)變量(即狀態(tài)變量):

mysql> show status;

設(shè)置系統(tǒng)變量

當(dāng)服務(wù)器啟動(dòng)時(shí),會(huì)將所有全局變量初始化為默認(rèn)值。這些默認(rèn)值可以在選項(xiàng)文件中或在命令行中指定的選項(xiàng)進(jìn)行更改。

可以通過以下方法設(shè)置系統(tǒng)變量:

修改 MySQL 源代碼,然后對(duì) MySQL 源代碼重新編譯(該方法適用于 MySQL 高級(jí)用戶,這里不做闡述)。
在 MySQL 配置文件(mysql.ini 或 mysql.cnf 或 my.cnf)中修改 MySQL 系統(tǒng)變量的值(需要重啟 MySQL 服務(wù)才會(huì)生效)。
在 MySQL 服務(wù)運(yùn)行期間,使用 SET 命令重新設(shè)置系統(tǒng)變量的值。

如何通過配置文件來設(shè)置變量值

以變量 local_infile 的設(shè)置為例,在命令終端使用 vim 打開配置文件進(jìn)行編輯:

[root@htlwk0001host ~]# vim /etc/my.cnf

在其中的 [mysqld] 下面添加如下內(nèi)容:

local-infile=ON # 能不能寫成 local_infile=ON,我不知道,沒有試過

說明:
1.表示開啟,其值可以設(shè)置為 ON 或 TRUE 或 1 都可以;表示關(guān)閉其值可以設(shè)置為 OFF 或 FALSE 或 0 都可以
2.通過配置文件設(shè)置的參數(shù)值必須重啟數(shù)據(jù)庫(kù)服務(wù)才能生效,并且是永久生效

通過命令行選項(xiàng)來設(shè)置變量值

mysqld --max_connections=200

動(dòng)態(tài)設(shè)置全局級(jí)的系統(tǒng)變量

更改全局變量,必須具有 SUPER 權(quán)限。設(shè)置全局變量的值的方法如下:

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)變量賦值,必須寫關(guān)鍵詞 global,不寫默認(rèn)是給會(huì)話級(jí)的系統(tǒng)變量賦值,如果不存在對(duì)應(yīng)的會(huì)話級(jí)變量則會(huì)報(bào)錯(cuò)
2.表示某種功能特性開啟還是關(guān)閉的變量,其值設(shè)置為 ON 或 TRUE 或 1 都可以表示開啟;設(shè)置為 OFF 或 FALSE 或 0 都可以表示關(guān)閉
3.更改全局變量只影響更改后連接客戶端的相應(yīng)會(huì)話變量,而不會(huì)影響目前已經(jīng)連接的客戶端的會(huì)話變量(即使客戶端執(zhí)行 SET GLOBAL 語(yǔ)句也不影響)。也就是說,對(duì)于修改全局變量之前連接的客戶端只有在客戶端重新連接后,才會(huì)影響到客戶端。簡(jiǎn)而言之,全局變量修改后,客戶端必須重新連接才會(huì)生效
4.使用 SET 設(shè)置全局變量成功后,如果 MySQL 服務(wù)重啟,數(shù)據(jù)庫(kù)的配置會(huì)重新初始化,一切按照配置文件進(jìn)行初始化,因此數(shù)據(jù)庫(kù)服務(wù)重啟后全局變量的配置會(huì)失效

設(shè)置靜態(tài)的系統(tǒng)變量

MySQL 中還有一些特殊的系統(tǒng)變量,如 log_bin、tmpdir、version、datadir,在 MySQL 服務(wù)實(shí)例運(yùn)行期間它們的值不能動(dòng)態(tài)修改,也就是不能使用 SET 命令進(jìn)行重新設(shè)置,這種變量稱為靜態(tài)變量。數(shù)據(jù)庫(kù)管理員可以使用前面提到的修改源代碼或更改配置文件來重新設(shè)置靜態(tài)變量的值。

設(shè)置會(huì)話級(jí)的系統(tǒng)變量

服務(wù)器還為每個(gè)連接的客戶端維護(hù)一系列會(huì)話變量。在連接時(shí)使用相應(yīng)全局變量的當(dāng)前值對(duì)客戶端的會(huì)話變量進(jìn)行初始化。設(shè)置會(huì)話變量不需要特殊權(quán)限,但客戶端只能更改自己的會(huì)話變量,而不能更改其它客戶端的會(huì)話變量。設(shè)置會(huì)話變量的值的方法如下:

mysql> SET @@session.pseudo_thread_id=5; # 如果不存在此會(huì)話級(jí)的系統(tǒng)變量會(huì)報(bào)錯(cuò) mysql> SET session pseudo_thread_id=5; # 如果不存在此會(huì)話級(jí)的系統(tǒng)變量會(huì)報(bào)錯(cuò) mysql> SET @@pseudo_thread_id=5; # 默認(rèn)設(shè)置的是會(huì)話系統(tǒng)變量,如果pseudo_thread_id是全局變量,不是會(huì)話級(jí)的變量,這樣賦值會(huì)報(bào)錯(cuò),當(dāng)然如果根本不存在此變量,也會(huì)報(bào)錯(cuò) mysql> SET pseudo_thread_id = 5; # 默認(rèn)設(shè)置的是會(huì)話系統(tǒng)變量,如果pseudo_thread_id是全局變量,不存在對(duì)應(yīng)的會(huì)話變量,這樣賦值會(huì)報(bào)錯(cuò),當(dāng)然如果根本不存在此變量,也會(huì)報(bào)錯(cuò)

注:
1.會(huì)話變量的配置在當(dāng)前會(huì)話退出后就失效了,會(huì)話斷開即失效。
2.LOCAL 是 SESSION 的同義詞,所以 SESSION 可以替換成 LOCAL
3.不指定 SESSION 或 GLOBAL 或 LOCAL 默認(rèn)是 SESSION

引用系統(tǒng)變量

@@GLOBAL.var_name @@SESSION.var_name @@LOCAL.var_name @@var_name # 沒有指定級(jí)別限定符,默認(rèn)優(yōu)先獲取會(huì)話級(jí)的系統(tǒng)變量的值

總結(jié)

不論使用哪種方式查看或者獲取系統(tǒng)變量的值,如果沒有指定級(jí)別限定符,優(yōu)先顯示或獲取會(huì)話變量的值;同樣的,賦值的時(shí)候如果沒有指定級(jí)別限定符,默認(rèn)是給會(huì)話變量賦值,但是如果不存在該會(huì)話變量則會(huì)報(bào)錯(cuò)

用戶自定義變量

用戶自定義變量分為用戶自定義的會(huì)話變量(即用戶變量)和局部變量。

用戶變量

用戶變量和會(huì)話級(jí)的系統(tǒng)變量類似,與連接會(huì)話有關(guān),是針對(duì)當(dāng)前登錄數(shù)據(jù)庫(kù)的會(huì)話的變量;也就是說,用戶在一個(gè)客戶端定義的變量不能被其它客戶端看到或使用。當(dāng)客戶端退出時(shí),該客戶端連接的所有的會(huì)話變量將自動(dòng)釋放。

用戶變量的作用:
可以先在用戶變量中保存值然后在后面的命令語(yǔ)句中引用它。這樣可以將值從一個(gè)語(yǔ)句傳遞到另一個(gè)語(yǔ)句。

用戶變量表示形式:
系統(tǒng)變量都是以 @@ 開頭,用戶自定義的會(huì)話變量以 @ 開頭,例如:@var_name,其中變量名可以由當(dāng)前字符集的英文、數(shù)字、.、_ 和 $ 組成。 默認(rèn)字符集是 cp1252 (Latin1)。可以用mysqld 的 --default-character-set 選項(xiàng)更改字符集。用戶變量名對(duì)大小寫不敏感。

聲明定義用戶變量

/*方式1*/ mysql> set @變量名=; /*方式2*/ mysql> set @變量名:=; /*方式3*/ mysql> select @變量名:=; /*方式4*/ mysql> select 字段 into @變量名 from;

注:用戶變量的賦值和變量的聲明一模一樣。

查看用戶變量的值

mysql> select @var_name;

注:show 命令只能查看系統(tǒng)變量的值,不能查看用戶變量的值。

參考示例

使用命令 set 聲明定義會(huì)話級(jí)的用戶變量

使用命令 set 定義會(huì)話級(jí)的用戶變量,定義形式是以 @ 開始,如:@var_name。分配符可以使用 = 或者 := 。未分配的用戶變量有一個(gè)默認(rèn)值 NULL,類型為字符串。

mysql> SET @t1=0, @t2=1, @t3='hello'; # 聲明定義多個(gè)用戶變量,字符串必須使用單引號(hào)或者雙引號(hào)引起來 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 聲明定義會(huì)話級(jí)的用戶變量

使用 select 定義用戶變量或者賦值,分配符必須為 := 而不能用 =,因?yàn)樵诜?set 語(yǔ)句中 = 被視為一個(gè)比較操作符。

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

使用 select into 語(yǔ)句聲明定義用戶變量

mysql> select name into @name from student; # “select name”這個(gè)name的返回值必須只有一個(gè)才能給變量@name賦值,否則報(bào)錯(cuò) 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 語(yǔ)句塊中使用關(guān)鍵字 declare 聲明定義的變量。

聲明定義局部變量

在存儲(chǔ)過程和函數(shù)中通過 declare 關(guān)鍵字在 BEGIN...END 語(yǔ)句塊中聲明定義局部變量,在 END 后變量無效。

注意:
1.declare 定義的變量名不能帶 @ 符號(hào)。
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;

局部變量的使用(查看、比較、運(yùn)算等)

mysql> select var_name;

參考示例

示例一:

DELIMITER $$ -- 聲明定界符號(hào)為$$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 ; -- 聲明定界符為分號(hào) CALL insert_ten_rows(); -- 調(diào)用存儲(chǔ)過程,使用分號(hào)結(jié)尾

示例二:

/*創(chuàng)建表test1*/ drop table IF EXISTS test1; create table test1(a int PRIMARY KEY,b int);/*聲明腳本的結(jié)束符為$$*/ DELIMITER $$ DROP PROCEDURE IF EXISTS proc1; CREATE PROCEDURE proc1() BEGIN/*聲明了一個(gè)局部變量*/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 $$/*聲明腳本的結(jié)束符為;*/ DELIMITER ;/*調(diào)用存儲(chǔ)過程*/ call proc1(); /*查看結(jié)果*/ select * from test1;

用戶變量和局部變量的區(qū)別

1.用戶變量必須以"@"開頭的;局部變量沒有這個(gè)符號(hào)
2.聲明局部變量必須指定數(shù)據(jù)類型,用戶變量不需要
3.作用范圍不同,用戶變量在整個(gè)連接會(huì)話中的任何地方都可以引用,局部變量只在 begin...end 語(yǔ)句塊內(nèi)有效,離開 begin...end 語(yǔ)句塊則失效

狀態(tài)變量

Server Status Variables(服務(wù)器狀態(tài)變量)

MySQL狀態(tài)變量(Server Status Variables)是當(dāng)前服務(wù)器從啟動(dòng)后累計(jì)的一些系統(tǒng)狀態(tài)信息,例如最大連接數(shù),累計(jì)的中斷連接等等,主要用于評(píng)估當(dāng)前系統(tǒng)資源的使用情況以進(jìn)一步分析系統(tǒng)性能而做出相應(yīng)的調(diào)整決策。這個(gè)估計(jì)有人會(huì)跟常規(guī)的系統(tǒng)變量混淆,其實(shí)狀態(tài)變量是動(dòng)態(tài)變化的,另外,狀態(tài)變量是只讀的:只能由MySQL服務(wù)器本身設(shè)置和修改,對(duì)于用戶來說是只讀的,不可以通過SET語(yǔ)句設(shè)置和修改它們,而系統(tǒng)變量則可以隨時(shí)修改。狀態(tài)變量也分為會(huì)話級(jí)與全局級(jí)別狀態(tài)信息。有些狀態(tài)變量可以用FLUSH STATUS語(yǔ)句重置為零值。

注意

MySQL 5.7 以后系統(tǒng)變量和狀態(tài)變量需要從數(shù)據(jù)庫(kù) performance_schema 中進(jìn)行獲取,數(shù)據(jù)庫(kù) information_schema 仍然保留了GLOBAL_STATUS,GLOBAL_VARIABLES 兩個(gè)表做兼容,如果希望沿用在數(shù)據(jù)庫(kù) information_schema 中進(jìn)行查詢的習(xí)慣,MySQL5.7 提供了參數(shù) show_compatibility_56,參數(shù)值設(shè)置為 ON 可以兼容 MySQL 5.7 之前的用法,否則就會(huì)報(bào)錯(cuò)(ERROR 3167 (HY000))

總結(jié)

以上是生活随笔為你收集整理的MySQL数据库变量_数据库参数_MySQL变量_系统变量_用户变量的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。