出于某种原因,我必须显式地将BIT(1)MySQL列转换为UNSIGNED以便返回0或1 IF我将该列包含为子查询的一部分但不作为“正常”查询。请允许我详细说明......
我有两个数据库表:竞赛和投票
CONTESTS - id, ..., ...
VOTES - ..., over BIT(1), ..., ...
如果我运行此查询,我会得到我期望的结果......
SELECT votes.over as vote_over FROM votes WHERE votes.contest_id = 38;
结果:
vote_over: 1 (ok, this makes sense)
但是,如果我尝试选择投票。作为子查询,我会得到一个奇怪的结果......
SELECT contests.id as contest_id,
(SELECT over FROM votes WHERE votes.contest_id = contests.id) as vote_over
FROM contests
where contests.id = 38;
结果:
contest_id: 38
vote_over: 49 (WHAT?)
为什么是vote_over(有点列)49如果它是子查询,但是如果它包含在上面的vanilla查询中则为1!那49的意义是什么?为什么不是2377? 49是110001,如果我将'over'列定义为bit(6)类型,这个问题会更有意义,但它有点(1)。这毫无意义!
在经历了一些困难之后,我偶然发现了这个问题给了我想要的东西......
SELECT `contests`.id as contest_id,
(SELECT cast(`votes`.over as unsigned) FROM (`votes`) WHERE votes.contest_id = contests.id)
FROM (`contests`) as vote_over
where contests.id = 38;
结果:
contest_id: 38
vote_over: 1
因此,虽然我找到了一种方法来从查询中获取我想要的内容,但我不明白为什么将vote_over结果转换为unsigned只会在子查询中产生影响。
其他信息:我正在笔记本电脑上的MySQL 5.6.14实例上运行这些查询。显然,这些查询只是假设来说明我已经孤立的问题。它们本身没有多大意义,我在调试一个更大的查询的过程中输入它们,其中子查询是必要的。
似乎有一些基本的东西,我不明白在这个问题暴露的子查询中签名位。请帮忙!
答案 0 :(得分:1)
这是因为SELECT [bit_column]
不应该首先返回可打印的结果集。你很幸运,它有时会返回一些可理解的东西。
http://dev.mysql.com/doc/refman/5.6/en/bit-field-literals.html:
位值以二进制值的形式返回。要以可打印的形式显示它们,请添加0或使用转换功能,例如BIN()。
在我的复选框中,SELECT [bit_column]
始终返回不可打印的字符。