TINYINT列值切换为true和1

时间:2017-11-13 20:03:59

标签: mysql ruby-on-rails tinyint

我一直面临这个奇怪的问题,其中一个表列是TINYINT。当我在本地查询表时,我得到列值为true或false的记录。我把代码放在生产上,有时会得到真值或假值。但突然之间,值从true或false切换到0或1.我不确定为什么会发生这种情况。对此问题的任何见解都会很棒。

请注意,我的TINYINT列的值只有1或0。

所以我从记录中创建了这个哈希,其中针对我存储相应TINYINT列值的每个键,如下所示:

@content_map: {1=>true, 338=>true, 375=>false}

在本地哈希看起来像上面。

在生产中,哈希看起来像:

@content_map: {1=>true, 338=>true, 375=>false} 

有时只需重新加载一次,如:

@content_map: {1=>0, 338=>1, 375=>0}

因此哈希值不断改变生产,这是我不明白的。它应该总是为真,或者应该始终为1.

我如何创建@cotent_map:

@content_map = Hash.new

以下是表格上的选择查询,其列为TINYINT

类型
@list = Action.all.select("id, free")

@list.map {|i| @content_map[i.id] = i.free}

1 个答案:

答案 0 :(得分:2)

MySQL没有布尔数据类型。它使用tinyint代替。对于那种类型,它无法使用t或f。

mysql> create table foo( boolboa BOOLEAN DEFAULT false );
Query OK, 0 rows affected (0,26 sec)

mysql> describe foo;
+---------+------------+------+-----+---------+-------+
| Field   | Type       | Null | Key | Default | Extra |
+---------+------------+------+-----+---------+-------+
| boolboa | tinyint(1) | YES  |     | 0       |       |
+---------+------------+------+-----+---------+-------+
1 row in set (0,01 sec)

mysql> insert into foo values(true);
Query OK, 1 row affected (0,05 sec)

mysql> insert into foo values('4');
Query OK, 1 row affected (0,05 sec)

mysql> insert into foo values(4);
Query OK, 1 row affected (0,02 sec)

mysql> select * from foo;
+---------+
| boolboa |
+---------+
|       1 |
|       4 |
|       4 |
+---------+
3 rows in set (0,00 sec)

来自MySQL文档。

  

BOOL,BOOLEAN

     

这些类型是TINYINT(1)的同义词。值为零   假。非零值被认为是真的:

更疯狂的部分

mysql> select * from foo where boolboa = true;
+---------+
| boolboa |
+---------+
|       1 |
+---------+
1 row in set (0,00 sec)

mysql> select * from foo where boolboa != false;
+---------+
| boolboa |
+---------+
|       1 |
|       4 |
|       4 |
+---------+
3 rows in set (0,00 sec)

mysql> select not false is true;
+-------------------+
| not false is true |
+-------------------+
|                 1 |
+-------------------+

mysql> select (not false is true) = true;
+----------------------------+
| (not false is true) = true |
+----------------------------+
|                          1 |
+----------------------------+

在我运行下面的查询之前,我担心MySQL会返回“90%1,10%0”。谢谢,它没有 - ))

mysql> select true != false;
+---------------+
| true != false |
+---------------+
|             1 |
+---------------+
1 row in set (0,00 sec)

<强>结论:

MySQL引擎本身甚至不知道什么是真的,什么不是假的,什么应该被视为非零,非零意味着什么等等。所以不要期望在这个问题上有太多的一致性 - ))