mysql - 强制性是什么意思? MySQL 用户变量

标签 mysql

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/

相关文章:

PHP, MySQL : Receive email, 在数据库中自动搜索并根据结果发送邮件

php - 使用 PHP MySQL Blowfish 登录站点

mysql - INNER JOIN MySQL 空条目

Windows 上的 MySQL 安装 - 以及如何修复丢失的 mysql.user?

mysql - 匹配 MySQL 注释的正则表达式

php - 在第二个表 MySQL 上按顺序加入 2 个表时的索引

mysql - 创建表 mytablename.now() 的语法是什么?

mysql - 如何在只有一列是查询基础的 MySQL 中进行数据透视

mysql - "404 Not Found"用于使用 Laravel 新创建的资源

来自另一个表的 MySql SumIF 而不更改值的顺序