这是什么意思?这与...有关吗?所有用户变量都有隐式 强制性价值
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?
答案 0 :(得分:9)
SET @test = 'test';
SELECT COERCIBILITY(@test), COERCIBILITY('test');
--- ---
2 4
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
强制性定义了在整理冲突的情况下将转换为什么。
具有较高矫顽力的表达式将转换为具有较低矫顽力的表达式的校对。
此功能可用于解决排序规则问题。例如,这两个查询以不同的顺序返回结果。
这一个:
SELECT col
FROM (
SELECT DATABASE() AS col
UNION ALL
SELECT 'X'
) q
ORDER BY
col;
----
'test'
'X'
这一个:
SET @t := 'X' COLLATE UTF8_BIN;
SELECT col
FROM (
SELECT DATABASE() AS col
UNION ALL
SELECT @t
) q
ORDER BY
col;
----
'X'
'test'
为什么会这样?
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'
在第二个查询中,@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'