(2021.12.20 Mon)
SQL中的变量分为user-defined variable, local variable和system variables.
User-defined Variable(UDV)
用户定义变量仅供一位用户使用,不能被其他用户使用。UDV在声明和使用时需要在前面加上@
符号。UDV也叫会话变量(session variable)。
设置UDV可使用SET
或SELECT
指令。注意到使用SELECT
指令赋值时,赋值符号为:=
。
SET @var1 = 1, @var2 = 2;
SELECT @var3 := 3, @var4 := 4;
SET @var6 = CAST(b'1000001' AS UNSIGNED);
SET @var7 = b'1000001';
UDV可定义的数据类型包括integer, decimal, floating-point, binary or nonbinary string, or NULL value。
调用方法
SELECT place FROM table1 WHERE var_s BETWEEN @var3 AND @var4;
可在没有声明的情况下直接调用则返回NULL
SELECT @var5;
局部变量Local Variables
局部变量用DECLARE
声明,并标明默认值用DEFAULT
。如果没有指定默认值,则默认为NULL
。
局部变量用于存储过程,其作用域是BEGIN...END
标记的范围。
DELIMITER //
CREATE PROCEDURE sp_test(var1 INT)
BEGIN
DECLARE start INT unsigned DEFAULT 1;
DECLARE finish INT unsigned DEFAULT 10;
SELECT var1, start, finish;
SELECT * FROM places WHERE place BETWEEN start AND finish;
END; //
DELIMITER ;
mysql > CALL sp_test(5);
System Variables
(2021.12.21 Tues)
系统变量,也叫全局变量。对所有客户端生效,只有super权限才能修改系统变量。其定义格式为
SET GLOBAL <var_name> = <var_value>;
SET @@global.<var_name> = <var_value>;
对系统变量可以通过表达式赋值,但是需要注意,服务器已经启动后(server runtime)使用SET
赋值时可以使用乘号(*
)等符号。而在服务器启动时(server startup)则不能通过运算符号对其赋值。下面的第一行和第四行都是正确的,其他错误。
$> mysql --max_allowed_packet = 16M
$> mysql --max_allowed_packet = 16*1024*1024
mysql> SET GLOBAL max_allowed_packet = 16M;
mysql> SET GLOBAL max_allowed_packet = 16*1024*1024;
在mysql console上,查看系统变量的指令是
mysql> show variables;
可以指定SESSION
和GLOBAL
关键词来找到对应的变量
SHOW GLOBAL VARIABLES LIKE '%ASDF%';
SHOW SESSION VARIABLES LIKE '%vnbm%';
Persist a global system variable to the mysqld-auto.cnf
file (and set the runtime value):
SET PERSIST max_connections = 1000;
SET @@PERSIST.max_connections = 1000;
Persist a global system variable to the mysqld-auto.cnf
file (without setting the runtime value):
SET PERSIST_ONLY back_log = 1000;
SET @@PERSIST_ONLY.back_log = 1000;
网友评论