我一直面临这个奇怪的问题,其中一个表列是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}
答案 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引擎本身甚至不知道什么是真的,什么不是假的,什么应该被视为非零,非零意味着什么等等。所以不要期望在这个问题上有太多的一致性 - ))