强制性意味着什么?MySQL用户变量

ice*_*l89 5 mysql

所有用户变量都具有隐式强制值

那是什么意思?这与...有关吗?

mysql> SET @a = 1; 
mysql> SET @A = @a; 
mysql> SELECT @a, @A;
mysql> SELECT @a, @A;
+------+------+
| @a    | @A    |
+------+------+
| 1 | 1 |
+------+------+
mysql> SET @a = 2;
mysql> SELECT @a, @A;
mysql> SELECT @a, @A;
+------+------+
| @a    | @A    |
+------+------+
| 2 | 2 |
+------+------+

@A被分配2可能是因为它"引用"@a?

Qua*_*noi 9

SET @test = 'test';
SELECT COERCIBILITY(@test), COERCIBILITY('test');

---  ---
2    4
Run Code Online (Sandbox Code Playgroud)

文档:

COERCIBILITY(str)

返回值具有下表中显示的含义.较低的值具有较高的优先级.

Coercibility  Meaning   Example
0             Explicit collation    Value with COLLATE clause
1             No collation          Concatenation of strings with different collations
2             Implicit collation    Column value
3             System constant       USER() return value
4             Coercible             Literal string
5             Ignorable             NULL or an expression derived from NULL
Run Code Online (Sandbox Code Playgroud)

强制性定义了在整理冲突的情况下将转换为什么.

具有较高矫顽力的表达将转换为具有较低矫顽力的表达的校对.

此功能可用于解决排序规则问题.例如,这两个查询以不同的顺序返回结果.

这个:

SELECT  col
FROM    (
        SELECT  DATABASE() AS col
        UNION ALL
        SELECT  'X'
        ) q
ORDER BY
        col;

----
'test'
'X'
Run Code Online (Sandbox Code Playgroud)

还有这个:

SET @t := 'X' COLLATE UTF8_BIN;
SELECT  col
FROM    (
        SELECT  DATABASE() AS col
        UNION ALL
        SELECT  @t
        ) q
ORDER BY
        col;

----
'X'
'test'
Run Code Online (Sandbox Code Playgroud)

为什么这样?

DATABASE()是一个系统函数,其返回值具有强制性3和默认数据库排序规则UTF8_GENERAL_CI.

第一个查询中的"X"是一个字符串文字,其强制性为4.

对于UNION所有值(即,3)的结果总是具有最小的强制性,并且具有最少的强制性的表达式的整理:

SELECT  col, COERCIBILITY(col), COLLATION(col)
FROM    (
        SELECT  DATABASE() AS col
        UNION ALL
        SELECT  'X'
        ) q
ORDER BY
        col;

--------
'test',  3, 'utf8_general_ci'
'X',     3, 'utf8_general_ci'
Run Code Online (Sandbox Code Playgroud)

在第二个查询中,@t是一个包含整理字符串值的变量UTF8_BIN.由于其强制性低于系统函数的强制性,因此它是结果集中使用的变量排序规则.

变量2的强制性是,因此结果的强制性是变量的强制性,以及整理:

SET @t := 'X' COLLATE UTF8_BIN;
SELECT  col, COERCIBILITY(col), COLLATION(col)
FROM    (
        SELECT  DATABASE() AS col
        UNION ALL
        SELECT  @t
        ) q
ORDER BY
        col;

--------
'X',     2, 'utf8_bin'
'test',  2, 'utf8_bin'
Run Code Online (Sandbox Code Playgroud)