二八佳人體似酥,腰懸利劍斬愚夫,雖然不見人頭落,暗里教君骨髓枯。
上一章簡(jiǎn)單介紹了 MySQL觸發(fā)器(二十六) ,如果沒有看過,請(qǐng)觀看上一章
一. 變量
在MySQL數(shù)據(jù)庫的存儲(chǔ)過程和函數(shù)中,可以使用變量來存儲(chǔ)查詢或計(jì)算的中間結(jié)果數(shù)據(jù),或者輸出最終的結(jié)果數(shù)據(jù)。
在 MySQL 數(shù)據(jù)庫中,變量分為系統(tǒng)變量
以及用戶自定義變量
。
一.一 系統(tǒng)變量
變量由系統(tǒng)定義,不是用戶定義,屬于服務(wù)器
層面。啟動(dòng)MySQL服務(wù),生成MySQL服務(wù)實(shí)例期間,MySQL將為MySQL服務(wù)器內(nèi)存中的系統(tǒng)變量賦值,這些系統(tǒng)變量定義了當(dāng)前MySQL服務(wù)實(shí)例的屬性、特征。這些系統(tǒng)變量的值要么是編譯MySQL時(shí)參數(shù)
的默認(rèn)值,要么是配置文件
(例如my.ini等)中的參數(shù)值。大家可以通過網(wǎng)址 https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html 查看MySQL文檔的系統(tǒng)變量。
系統(tǒng)變量分為全局系統(tǒng)變量(需要添加global
關(guān)鍵字)以及會(huì)話系統(tǒng)變量(需要添加 session
關(guān)鍵字),有時(shí)也把全局系統(tǒng)變量簡(jiǎn)稱為全局變量,有時(shí)也把會(huì)話系統(tǒng)變量稱為local變量。**如果不寫,默認(rèn)會(huì)話級(jí)別。**靜態(tài)變量(在 MySQL 服務(wù)實(shí)例運(yùn)行期間它們的值不能使用 set 動(dòng)態(tài)修改)屬于特殊的全局系統(tǒng)變量。
每一個(gè)MySQL客戶機(jī)成功連接MySQL服務(wù)器后,都會(huì)產(chǎn)生與之對(duì)應(yīng)的會(huì)話。會(huì)話期間,MySQL服務(wù)實(shí)例會(huì)在MySQL服務(wù)器內(nèi)存中生成與該會(huì)話對(duì)應(yīng)的會(huì)話系統(tǒng)變量,這些會(huì)話系統(tǒng)變量的初始值是全局系統(tǒng)變量值的復(fù)制。如下圖:
- 全局系統(tǒng)變量針對(duì)于所有會(huì)話(連接)有效,但
不能跨重啟
- 會(huì)話系統(tǒng)變量?jī)H針對(duì)于當(dāng)前會(huì)話(連接)有效。會(huì)話期間,當(dāng)前會(huì)話對(duì)某個(gè)會(huì)話系統(tǒng)變量值的修改,不會(huì)影響其他會(huì)話同一個(gè)會(huì)話系統(tǒng)變量的值。
- 會(huì)話1對(duì)某個(gè)全局系統(tǒng)變量值的修改會(huì)導(dǎo)致會(huì)話2中同一個(gè)全局系統(tǒng)變量值的修改。
在MySQL中有些系統(tǒng)變量只能是全局的,例如 max_connections 用于限制服務(wù)器的最大連接數(shù);有些系統(tǒng)變量作用域既可以是全局又可以是會(huì)話,例如 character_set_client 用于設(shè)置客戶端的字符集;有些系統(tǒng)變量的作用域只能是當(dāng)前會(huì)話,例如 pseudo_thread_id 用于標(biāo)記當(dāng)前會(huì)話的 MySQL 連接 ID。
一.一.一 查看所有或部分系統(tǒng)變量
#查看所有全局變量
SHOW GLOBAL VARIABLES;
#查看所有會(huì)話變量
SHOW SESSION VARIABLES;
或
SHOW VARIABLES;
一.一.二 查看滿足條件的部分系統(tǒng)變量
#查看滿足條件的部分系統(tǒng)變量。
SHOW GLOBAL VARIABLES LIKE '%標(biāo)識(shí)符%';
#查看滿足條件的部分會(huì)話變量
SHOW SESSION VARIABLES LIKE '%標(biāo)識(shí)符%';
show session variables like '%log%';
一.一.三 查看指定的系統(tǒng)變量 具體的變量名
作為 MySQL 編碼規(guī)范,MySQL 中的系統(tǒng)變量以兩個(gè)“@”
開頭,其中“@@global”僅用于標(biāo)記全局系統(tǒng)變量,“@@session”僅用于標(biāo)記會(huì)話系統(tǒng)變量。“@@”首先標(biāo)記會(huì)話系統(tǒng)變量,如果會(huì)話系統(tǒng)變量不存在,則標(biāo)記全局系統(tǒng)變量。
#查看指定的系統(tǒng)變量的值
SELECT @@global.變量名;
#查看指定的會(huì)話變量的值
SELECT @@session.變量名;
#或者
SELECT @@變量名;
select @@global.binlog_cache_size;
一.一.四 修改系統(tǒng)變量值
有些時(shí)候,數(shù)據(jù)庫管理員需要修改系統(tǒng)變量的默認(rèn)值,以便修改當(dāng)前會(huì)話或者M(jìn)ySQL服務(wù)實(shí)例的屬性、特征。具體方法:
方式1:修改MySQL配置文件
,繼而修改MySQL系統(tǒng)變量的值(該方法需要重啟MySQL服務(wù))
方式2:在MySQL服務(wù)運(yùn)行期間,使用“set”命令重新設(shè)置系統(tǒng)變量的值
#為某個(gè)系統(tǒng)變量賦值
#方式1:
SET @@global.變量名=變量值;
#方式2:
SET GLOBAL 變量名=變量值;
#為某個(gè)會(huì)話變量賦值
#方式1:
SET @@session.變量名=變量值;
#方式2:
SET SESSION 變量名=變量值;
舉例:
SELECT @@global.autocommit;
SET GLOBAL autocommit=0;
SELECT @@session.tx_isolation;
SET @@session.tx_isolation='read-uncommitted';
SET GLOBAL max_connections = 1000;
SELECT @@global.max_connections;
一.二 用戶變量
用戶變量是用戶自己定義的,作為 MySQL 編碼規(guī)范,MySQL 中的用戶變量以一個(gè)“@”
開頭。根據(jù)作用范圍不同,又分為會(huì)話用戶變量
和局部變量
。
- 會(huì)話用戶變量:作用域和會(huì)話變量一樣,只對(duì)
當(dāng)前連接
會(huì)話有效。 - 局部變量:只在 BEGIN 和 END 語句塊中有效。局部變量只能在
存儲(chǔ)過程和函數(shù)
中使用。
一.二.一 會(huì)話用戶變量
變量定義:
#方式1:“=”或“:=”
SET @用戶變量 = 值;
SET @用戶變量 := 值;
#方式2:“:=” 或 INTO關(guān)鍵字
SELECT @用戶變量 := 表達(dá)式 [FROM 等子句];
SELECT 表達(dá)式 INTO @用戶變量 [FROM 等子句];
查看用戶變量的值 (查看、比較、運(yùn)算等)
SELECT @用戶變量
舉例
SET @a = 1;
SELECT @a;
SELECT @num := COUNT(*) FROM user;
SELECT @num;
SELECT AVG(age) INTO @age FROM user;
SELECT @age;
-- 查看某個(gè)未聲明的變量時(shí),將得到NULL值
SELECT @big;
一.二.二 局部變量
定義:可以使用DECLARE
語句定義一個(gè)局部變量
作用域:僅僅在定義它的 BEGIN … END 中有效
位置:只能放在 BEGIN … END 中,而且只能放在第一句
BEGIN
#聲明局部變量
DECLARE 變量名1 變量數(shù)據(jù)類型 [DEFAULT 變量默認(rèn)值];
DECLARE 變量名2,變量名3,... 變量數(shù)據(jù)類型 [DEFAULT 變量默認(rèn)值];
#為局部變量賦值
SET 變量名1 = 值;
SELECT 值 INTO 變量名2 [FROM 子句];
#查看局部變量的值
SELECT 變量1,變量2,變量3;
END
1.定義變量
DECLARE 變量名 類型 [default 值]; # 如果沒有DEFAULT子句,初始值為NULL
舉例:
DECLARE age INT DEFAULT 24;
2.變量賦值
方式1:一般用于賦簡(jiǎn)單的值
SET 變量名=值;
SET 變量名:=值;
方式2:一般用于賦表中的字段值
SELECT 字段名或表達(dá)式 INTO 變量名 FROM 表;
3.使用變量(查看、比較、運(yùn)算等)
SELECT 局部變量名;
舉例1:聲明局部變量,并分別賦值為 user 表中 id為 1 的 name 和 age
DELIMITER //
CREATE PROCEDURE set_value()
BEGIN
DECLARE l_name VARCHAR(25);
DECLARE l_age int(5);
SELECT name,age INTO l_name,l_age
FROM user
WHERE id = 1;
SELECT l_name,l_age;
END //
DELIMITER ;
舉例2:聲明兩個(gè)變量,求和并打印 (分別使用會(huì)話用戶變量、局部變量的方式實(shí)現(xiàn))
#方式1:使用用戶變量
SET @m=1;
SET @n=1;
SET @sum=@m+@n;
SELECT @sum;
#方式2:使用局部變量
DELIMITER //
CREATE PROCEDURE add_value()
BEGIN
#局部變量
DECLARE m INT DEFAULT 1;
DECLARE n INT DEFAULT 3;
DECLARE SUM INT;
SET SUM = m+n;
SELECT SUM;
END //
DELIMITER ;
-- 切換標(biāo)識(shí)符
delimiter //
-- 創(chuàng)建存儲(chǔ)語句
create PROCEDURE p5(INOUT s_email varchar(100), IN s_username varchar(100))
begin
DECLARE dbEmail varchar(100) default '';
select email into dbEmail from auth_user where username = s_username ;
set s_email = concat(s_email,dbEmail);
-- 結(jié)束
end //
-- 恢復(fù)標(biāo)識(shí)符為 ;
delimiter ;
-- 定義一個(gè)變量,要有默認(rèn)值為 ''
set @s_email = 'hello:';
-- 查詢一下自定義的變量值
select @s_email;
-- 調(diào)用存儲(chǔ)函數(shù)
call p5(@s_email, 'admin');
-- 查詢一下變量,發(fā)現(xiàn)是有值的
select @s_email;
1.2.4 對(duì)比會(huì)話用戶變量與局部變量
– | 作用域 | 定義位置 | 語法 |
---|---|---|---|
會(huì)話用戶變量 | 當(dāng)前會(huì)話 | 會(huì)話的任何地方 | 加@符號(hào),不用指定類型 |
局部變量 | 定義它的BEGIN END中 | BEGIN END的第一句話 | 一般不用加@,需要指定類型 |
二. 變量應(yīng)用,處理表大小寫問題
在開發(fā)中,尤其是 Linux 服務(wù)器, 常常會(huì)出現(xiàn)表 大小寫的問題
在 Mysql 目錄下修改 my.cnf
加入
lower_case_table_names=1
show variables like ‘%case%’;
原因是文件權(quán)限的問題 , 修改權(quán)限為 777
chmod 777 my.cnf
重啟MySQL, 問題解決
謝謝!!!
方 |加@符號(hào),不用指定類型|
| 局部變量 | 定義它的BEGIN END中 | BEGIN END的第一句話 |一般不用加@,需要指定類型|
二. 處理表大小寫問題
在開發(fā)中,尤其是 Linux 服務(wù)器, 常常會(huì)出現(xiàn)表 大小寫的問題
在 Mysql 目錄下修改 my.cnf
加入
lower_case_table_names=1
show variables like ‘%case%’;
原因是文件權(quán)限的問題 , 修改權(quán)限為 777
chmod 777 my.cnf
重啟MySQL, 問題解決
三. MySQL 8.0的新特性—全局變量的持久化 set persist
在MySQL數(shù)據(jù)庫中,全局變量可以通過SET GLOBAL語句來設(shè)置。
例如,設(shè)置服務(wù)器語句超時(shí)的限制,可以通過設(shè)置系統(tǒng)變量max_execution_time來實(shí)現(xiàn):
SET GLOBAL MAX_EXECUTION_TIME=2000;
使用SET GLOBAL語句設(shè)置的變量值只會(huì)臨時(shí)生效
。數(shù)據(jù)庫重啟
后,服務(wù)器又會(huì)從MySQL配置文件中讀取變量的默認(rèn)值。
MySQL 8.0版本新增了SET PERSIST
命令。例如,設(shè)置服務(wù)器的最大連接數(shù)為1000:
SET PERSIST global max_connections = 1000;
MySQL會(huì)將該命令的配置保存到數(shù)據(jù)目錄下的mysqld-auto.cnf
文件中,下次啟動(dòng)時(shí)會(huì)讀取該文件,用其中的配置來覆蓋默認(rèn)的配置文件。
舉例:
查看全局變量max_connections的值,結(jié)果如下:
mysql> show variables like '%max_connections%';
+------------------------+-------+
| Variable_name | Value |
+------------------------+-------+
| max_connections | 151 |
| mysqlx_max_connections | 100 |
+------------------------+-------+
2 rows in set, 1 warning (0.00 sec)
設(shè)置全局變量max_connections的值:
mysql> set persist max_connections=1000;
Query OK, 0 rows affected (0.00 sec)
重啟MySQL服務(wù)器
,再次查詢max_connections的值:文章來源:http://www.zghlxwxcb.cn/news/detail-631023.html
mysql> show variables like '%max_connections%';
+------------------------+-------+
| Variable_name | Value |
+------------------------+-------+
| max_connections | 1000 |
| mysqlx_max_connections | 100 |
+------------------------+-------+
2 rows in set, 1 warning (0.00 sec)
謝謝!!!文章來源地址http://www.zghlxwxcb.cn/news/detail-631023.html
到了這里,關(guān)于MySQL變量(二十七)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!