当我这样做时
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 (与自制软件一起安装)。
答案 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)
手册陈述(某处)类似整数的表达式(包括BIT
,BOOL
等)在BIGINT
中完成,类似十进制的表达式以一定的精度完成,划分到div_precision_increment
小数位,浮动操作在DOUBLE
完成。
还有关于SIGNED
和UNSIGNED
的规则,多年来一直存在关于处理此类问题的错误。例如,减去两个UNSIGNED
值是什么意思,特别是如果第一个值更小?
由于数字1
以字符'1'
的形式出现,而不管LONGLONG
或其他什么,因此无关紧要。
或许--column-type-info
比有用更令人困惑?