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

时间:2009-09-17 10:56:40

标签: 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?

1 个答案:

答案 0 :(得分:9)

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

---  ---
2    4

来自documentation

  

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'