为什么我必须在mysql子查询中将一点(1)转换为unsigned?

时间:2014-07-26 17:38:40

标签: mysql casting bit

出于某种原因,我必须显式地将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实例上运行这些查询。显然,这些查询只是假设来说明我已经孤立的问题。它们本身没有多大意义,我在调试一个更大的查询的过程中输入它们,其中子查询是必要的。

似乎有一些基本的东西,我不明白在这个问题暴露的子查询中签名位。请帮忙!

1 个答案:

答案 0 :(得分:1)

这是因为SELECT [bit_column]不应该首先返回可打印的结果集。你很幸运,它有时会返回一些可理解的东西。

http://dev.mysql.com/doc/refman/5.6/en/bit-field-literals.html

  

位值以二进制值的形式返回。要以可打印的形式显示它们,请添加0或使用转换功能,例如BIN()。

在我的复选框中,SELECT [bit_column]始终返回不可打印的字符。