All user variables have an implicit coercibility value
这是什么意思?这和……有关系吗?
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?
最佳答案
SET @test = 'test';
SELECT COERCIBILITY(@test), COERCIBILITY('test');
--- ---
2 4
来自documentation :
COERCIBILITY(str)
The return values have the meanings shown in the following table. Lower values have higher precedence.
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'
关于mysql - 强制性是什么意思? MySQL 用户变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1438103/