0

我一直面临这个奇怪的问题,其中表列是 TINYINT。当我在本地查询表时,我得到列值为真或假的记录。我将代码投入生产,有时它会得到真值或假值。但是突然之间,这些值从真或假切换到 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}
4

1 回答 1

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 文档。

布尔值,布尔值

这些类型是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 引擎本身甚至不知道什么是真,什么不是假,什么应该被视为非零,非零是什么意思等等。所以不要期望在这个问题上有太多的一致性 -))

于 2017-11-13T20:12:25.283 回答