本文为mariadb官方手册:User-Defined Variables的译文。

原文:https://mariadb.com/kb/en/user-defined-variables/
我提交到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;

翻译:用户变量(User-Defined Variable)(已提交到MariaDB官方手册)相关推荐

  1. 翻译:XtraDB/InnoDB中的AUTO_INCREMENT处理方式(已提交到MariaDB官方手册)

    本文为mariadb官方手册:XtraDB/InnoDB中的AUTO_INCREMENT处理方式的译文. 原文:https://mariadb.com/kb/en/auto_increment-han ...

  2. 翻译:TRUNCATE TABLE(已提交到MariaDB官方手册)

    本文为mariadb官方手册:TRUNCATE TABLE的译文. 原文:https://mariadb.com/kb/en/truncate-table/ 我提交到MariaDB官方手册的译文:ht ...

  3. 翻译:group_concat()函数(已提交到MariaDB官方手册)

    本文为mariadb官方手册:group_concat()函数的译文. 原文:https://mariadb.com/kb/en/group_concat/ 我提交到MariaDB官方手册的译文:ht ...

  4. c语言变量周围堆栈损坏csdn,围绕变量“输入”的堆栈已损坏(Stack around the variable 'input' was corrupted)...

    围绕变量"输入"的堆栈已损坏(Stack around the variable 'input' was corrupted) 我刚开始使用C语言,但遇到了这个错误. 我试图在网上 ...

  5. FastAPI 教程翻译 - 用户指南 26 - 安全性

    FastAPI 教程翻译 - 用户指南 26 - 安全性 FastAPI Tutorial - User Guide - Secuity Security Intro 安全性简介 There are ...

  6. 深入理解javascript内部原理(2): 变量对象(Variable object)

    本文是翻译Dmitry Soshnikov 的文章 Variable object 文章地址:http://dmitrysoshnikov.com/ecmascript/chapter-2-varia ...

  7. MySQL5.7中英对照文档_用户变量 User-Defined Variables

    You can store a value in a user-defined variable in one statement and refer to it later in another s ...

  8. 将.gitignore应用于已提交的文件

    本文翻译自:Applying .gitignore to committed files I have committed loads of files that I now want to igno ...

  9. php表单的提交方法有什么,php – 确定哪个表单已提交的最佳方法是什么?

    目前,当我设计表单时,我喜欢将提交按钮的名称保持等于表单的id.然后,在我的php中,我只是执行if(isset($_ POST ['submitName']))以检查表单是否已提交以及表单已提交. ...

最新文章

  1. 韩系春装搭配 穿出优雅气质
  2. Python【Python基础】
  3. Array String对象的方法和属性
  4. python才不会从入门到放弃_一步一步理解 python web 框架,才不会从入门到放弃 -- 启程出发...
  5. 基于gulp的前端脚手架(二)
  6. 简明扼要的反射入门教程
  7. idea git配置好之后无法看到已修改的文件解决方法
  8. 老web换新枝----Sails.js移动设备的全新生产力(一)
  9. mysql授权远程访问 网段_MySQL授权和开启远程访问
  10. linux wifi问题,Ubuntu下wifi问题解决
  11. 16S扩增子数据提交GSA实操手册—发表文章前必备技能
  12. editplus怎么运行java程序
  13. Docker 配置国内源加速镜像下载
  14. OptaPlanner快速开始
  15. 正定二次型与正定矩阵
  16. Android手机屏幕的三种状态
  17. 如何在安装 Enscape渲染器时禁用或启用弹出窗口
  18. Photo2Cartoon,照片图片批量转漫画
  19. 喀纳斯与圣诞之夜(随想)
  20. Android-谷歌语音识别之离线识别(二)

热门文章

  1. mysql强制禁止使用索引_MYSQL强制使用索引和禁止使用索引
  2. 16位调色板和32位调色板_使调色板可访问
  3. 微信小程序如何发送 http 请求
  4. 精通Spring Boot——第十一篇:使用自定义配置
  5. Linux Makefile 中的陷阱【转】
  6. Sublime Text怎么快速建立一个html5页面模板
  7. 服务治理·理论篇(一)
  8. 《爆发》作者:大数据领域将有新赢家
  9. 码栈开发手册(一)---编码方式开发(初级课程②)
  10. SegmentFault Hackathon 文艺复兴