You are viewing the documentation of TiDB v6.0 (DMR). PingCAP does not provide bug fixes for v6.0. Any bugs will be fixed in future releases.

For general purposes, please use the latest LTS version of the TiDB database.

User-Defined Variables

This document describes the concept of user-defined variables in TiDB and the methods to set and read the user-defined variables.


User-defined variables are still an experimental feature. It is NOT recommended that you use them in the production environment.

The format of the user-defined variables is @var_name. The characters that compose var_name can be any characters that can compose an identifier, including the numbers 0-9, the letters a-zA-Z, the underscore _, the dollar sign $, and the UTF-8 characters. In addition, it also includes the English period .. The user-defined variables are case-insensitive.

The user-defined variables are session-specific, which means a user variable defined by one client connection cannot be seen or used by other client connections.

Set the user-defined variables

You can use the SET statement to set a user-defined variable, and the syntax is SET @var_name = expr [, @var_name = expr] ...;. For example:

SET @favorite_db = 'TiDB';
SET @a = 'a', @b = 'b', @c = 'c';

For the assignment operator, you can also use :=. For example:

SET @favorite_db := 'TiDB';

The content to the right of the assignment operator can be any valid expression. For example:

SET @c = @a + @b;
set @c = b'1000001' + b'1000001';

Read the user-defined variables

To read a user-defined variable, you can use the SELECT statement to query:

SELECT @a1, @a2, @a3
| @a1  | @a2  | @a3  |
|    1 |    2 |    4 |

You can also assign values in the SELECT statement:

SELECT @a1, @a2, @a3, @a4 := @a1+@a2+@a3;
| @a1  | @a2  | @a3  | @a4 := @a1+@a2+@a3 |
|    1 |    2 |    4 |                  7 |

Before the variable @a4 is modified or the connection is closed, its value is always 7.

If a hexadecimal literal or binary literal is used when setting the user-defined variable, TiDB will treat it as a binary string. If you want to set it to a number, you can manually add the CAST conversion, or use the numeric operator in the expression:

SET @v1 = b'1000001';
SET @v2 = b'1000001'+0;
SET @v3 = CAST(b'1000001' AS UNSIGNED);
SELECT @v1, @v2, @v3;
| @v1  | @v2  | @v3  |
| A    | 65   | 65   |

If you refer to a user-defined variable that has not been initialized, it has a value of NULL and a type of string.

SELECT @not_exist;
| @not_exist |
| NULL       |

In addition to using the SELECT statement to read the user-defined variables, another common usage is the PREPARE statement. For example:

SET @s = 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';
SET @a = 6;
SET @b = 8;
EXECUTE stmt USING @a, @b;
| hypotenuse |
|         10 |

The contents of the user-defined variables are not recognized as identifiers in the SQL statements. For example:

SELECT * from t;
| a |
| 1 |
SET @col = "`a`";
| @col |
| `a`  |

MySQL compatibility

Except for SELECT ... INTO <variable>, the syntax supported in MySQL and TiDB is identical.

For more information, see User-Defined Variables in MySQL.

Was this page helpful?