本文為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;