所有用户变量都具有隐式强制值
那是什么意思?这与...有关吗?
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
Run Code Online (Sandbox Code Playgroud)
从文档:
COERCIBILITY(str)返回值具有下表中显示的含义.较低的值具有较高的优先级.
Run Code Online (Sandbox Code Playgroud)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'
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)
| 归档时间: |
|
| 查看次数: |
1675 次 |
| 最近记录: |