我提交到 MariaDB 官方手册的译文: https://mariadb.com/kb/zh-cn/user-defined-variables/
用户变量是指由用户创建, 并存在于会话当中的变量这意味着其他用户无法访问, 且在当前会话关闭时, 该用户变量自动过期但是, 这些变量可以在多个查询和存储程序 stored programs 之间共享使用
用户变量的名称前必须加上单个 at 符号作为前缀 (@) 用户变量的名称部分可以安全地使用保留关键词, 名称部分所允许的字符包括 ASCII 字母数字美元符 ($) 下划线 (_) 和点 (.) 如果要使用其他字符, 需要使用以下几种引用方式包围它:
- @`var_name`
- @var_name
- @"var_name"
这些字符可以进行正常的转义(逃逸)
现在用户变量是不区分大小写的, 但在 MySQL 4.1 和更老的版本中是区分大小写的
用户变量是无法声明的可以直接读取一个存在或不存在的用户变量, 只不过不存在的用户变量返回值为 NULL 要设置一个用户变量, 可以使用以下几种方式:
SET 语句;
SQL 语句中使用 := 操作符;
SELECT ... INTO
由于无法声明用户变量的类型, 唯一能够强制它们类型的方式是使用 CAST()或 CONVERT()进行转换:
SET @str = CAST(123 AS CHAR(5));
如果变量未赋值, 则其值为 NULL:
- SELECT @x IS NULL;
- +------------+
- | @x IS NULL |
- +------------+
- | 1 |
- +------------+
在同一个语句中同时读取变量设置变量的值是不安全的行为(除非使用的是 SET 命令), 因为这些操作的顺序是不定的
用户变量可以用在绝大多数可以接受 SQL 表达式的 MariaDB 语句和子句中但是有一些例外, 例如 LIMIT 子句
用户变量不能替代语句中的关键字标识符等, 除非它们用在预编译 PREPARE 语句中(译者注: 英文版内容缺失, 此句为本人自行修改例如 @a="SELECT", 却无法 @a * from t 正如下面的例子中, 如果用户变量 @sql 不在 PREPARE 语句中进行预编译, 它无法直接执行)
- @sql = DELETE FROM my_table WHERE c>1;;
- PREPARE stmt FROM @sql;
- EXECUTE stmt;
- DEALLOCATE PREPARE stmt;
另一个较常用的功能是在查询语句中充当计数器:
- SET @var = 0;
- SELECT a, b, c, (@var:=@var+1) AS counter FROM my_table;
回到 Linux 系列文章大纲: http://www.cnblogs.com/f-ck-need-u/p/7048359.html
回到网站架构系列文章大纲: http://www.cnblogs.com/f-ck-need-u/p/7576137.html
回到数据库系列文章大纲: http://www.cnblogs.com/f-ck-need-u/p/7586194.html
来源: http://www.bubuko.com/infodetail-2534828.html