MySQL:SELECT(column ==' value')返回“LONGLONG”类型的结果而不是BOOL

时间:2015-12-26 22:32:55

标签: mysql sqldatatypes

当我这样做时

SELECT (column1 == 1) AS isOne FROM table1;

我希望结果集的类型为BOOL,a.k.a。TINYINT(1)。 不幸的是,我收到了一个" LONGLONG"。

这是一个实验。

CREATE TABLE `orders` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `ref` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

使用额外类型信息--column-type-info启动MySQL提示符:

mysql> select id, id=1 as isOne  from orders;
Field   1:  `id`
Catalog:    `def`
Database:   `reson_it`
Table:      `orders`
Org_table:  `orders`
Type:       LONG
Collation:  binary (63)
Length:     11
Max_length: 1
Decimals:   0
Flags:      NOT_NULL PRI_KEY AUTO_INCREMENT NUM PART_KEY

Field   2:  `isOne`
Catalog:    `def`
Database:   ``
Table:      ``
Org_table:  ``
Type:       LONGLONG <--------------- WTF Why is this not a boolean/tinyint(1) ???
Collation:  binary (63)
Length:     1
Max_length: 1
Decimals:   0
Flags:      NOT_NULL BINARY NUM


+----+-------+
| id | isOne |
+----+-------+
|  1 |     1 |
+----+-------+
1 row in set (0.00 sec)

正如你所看到的,我在&#34; isOne&#34;中看到了这种LONGLONG类型。结果字段。为什么会这样?

我在mac上使用 MySQL 5.6.27 (与自制软件一起安装)。

2 个答案:

答案 0 :(得分:1)

  

为什么会这样?

因为那是MySQL如何做到的。

有线协议不允许列在结果集中从行到行具有不同的数据类型(也不会理智),因此服务器必须预先确定每列的数据类型,特别是在输出时列是派生的,不是直接来自单个特定的表/列(因为,在这种情况下,输出列的定义已经知道......根据定义,您可能会说...来源专栏的定义)。

您观察到的行为可能会或可能不会被清楚地记录下来 - 如果是,我没有找到它 - 但是可以从添加两个的结果这一事实推断出来将TINYINT列组合在一起,甚至将文字0添加到TINYINT,实际上也是BIGINT(longlong) - 尽管理论上它不需要大于SMALLINT {1}}或TINYINT - 取决于查询 - 但MySQL总是使用64位值进行内部操作和派生整数输出列。

最后一部分记录在案,并且将其推断到这种情况似乎也是合理的。

http://dev.mysql.com/doc/refman/5.6/en/arithmetic-functions.html

答案 1 :(得分:1)

手册陈述(某处)类似整数的表达式(包括BITBOOL等)在BIGINT中完成,类​​似十进制的表达式以一定的精度完成,划分到div_precision_increment小数位,浮动操作在DOUBLE完成。

还有关于SIGNEDUNSIGNED的规则,多年来一直存在关于处理此类问题的错误。例如,减去两个UNSIGNED值是什么意思,特别是如果第一个值更小?

由于数字1以字符'1'的形式出现,而不管LONGLONG或其他什么,因此无关紧要。

或许--column-type-info比有用更令人困惑?