SQL语句中的"set+0"是什么意思?

7

我对这个SQL语句的含义感到困惑:

SELECT exhibitor_categories+0 from exhibitor_registry

什么是 exhibitor_categories+0?它返回每行的数字。

exhibitor_categories 的定义如下:

set('contemporary', 'classical impression / transitional', 'outdoor', 'home accessories')

感谢您的时间 :)

+1 很好的问题。我想知道SQL Server 200/2005是否有相应的等价物? - J.Hendrix
2个回答

7
它会将集合值隐式转换为 INTEGER
集合被视为位图,因此第一个值设置位 0,第二个值设置位 1,以此类推。
mysql> CREATE TABLE exhibitor_registry(exhibitor_categories set('contemporary',
'classical impression / transitional', 'outdoor', 'home accessories') NOT NULL);

Query OK, 0 rows affected (0.08 sec)

mysql> INSERT
    -> INTO    exhibitor_registry
    -> VALUES  ('contemporary,classical impression / transitional,outdoor');
Query OK, 1 row affected (0.03 sec)

mysql> SELECT  exhibitor_categories
    -> FROM    exhibitor_registry;
+----------------------------------------------------------+
| exhibitor_categories                                     |
+----------------------------------------------------------+
| contemporary,classical impression / transitional,outdoor |
+----------------------------------------------------------+
1 row in set (0.00 sec)

mysql> SELECT  exhibitor_categories + 0
    -> FROM    exhibitor_registry;
+--------------------------+
| exhibitor_categories + 0 |
+--------------------------+
|                        7 |
+--------------------------+
1 row in set (0.00 sec)

例如,像“contemporary”这样的值如何转换为整数?或者,由于它是一个集合,如何将“contemporary,outdoor”转换为整数?您是否有关于将集合值转换为整数的目的的任何见解? - Obay
哇!非常有帮助! 但是它怎么变成7的呢?因为1+2+3=6,不应该是6吗? - Obay
1
@Obay: 一幅位图将2的幂次方相加,以防混淆。它是 2^0 + 2^1 + 2^2 = 1 + 2 + 4 = 7。如果是 6,你就无法区分 1 + 2 + 32 + 4 - Quassnoi

4
请查看http://dev.mysql.com/doc/refman/5.0/en/set.html了解详细信息,但基本上像这样的字段被称为“集合” - 它具有可能值的列表,这些值只能是其中之一或多个。该值存储为数字...这意味着当某人将值设置为“outdoor”时,“exhibitor_categories”实际上存储值4,因为它设置第三位 - “0100”。稍后从数据库中获取值时,mysql会自动将“0100”转换回“outdoor”。
但是,通过在查询中添加+0,您可以强制结果保持为数字,因此如果行的值在这种情况下设置为“outdoor”,则实际上会得到数字值“0100”。
抱歉混淆了枚举和集合。
你可能会问,为什么它将值设置为“0100”而不是像枚举中那样说“3”?因为集合可以保存多个值 - 如果选择了值“contemporary”(0001)和“outdoor”(0100),它将存储“0101” <-设置第1和第3位,如果使用+0代码,则返回“5”。

1
这是一个set(位图),而不是一个enum。存储outdoor将把数值设置为4 - Quassnoi
Quassnoi,为什么是4?既然它是第三个声明的元素,难道不应该是3吗? - Obay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接