对于布尔值,Postgres和MySql之间的返回值差异

时间:2011-06-14 11:16:25

标签: mysql ruby-on-rails-3 postgresql

如果我这样做:

ActiveRecord::Base.connection.execute('select 1 as t').first

在Postgres和MySql上我得到了这个:

MySql: [1]
Postgres: {"t"=>"1"}

有人能解释一下这是什么意思吗?!

1 个答案:

答案 0 :(得分:0)

无论bug在哪里,这都显示了两个数据库之间的有趣差异(以及为什么跨数据库抽象很难实现的一个例子)。

MySQL没有真正的bool类型。它只使用tinyints作为布尔值。

关于MySQL:

SELECT true;
+------+
| TRUE |
+------+
|    1 |
+------+
1 row in set (0.00 sec)

布尔表达式也计算为整数:

select true is not false;
+-------------------+
| true is not false |
+-------------------+
|                 1 |
+-------------------+
1 row in set (0.00 sec)

在PostgreSQL上

PostgreSQL支持一个真正的布尔类型,返回't'或'f'。

select true;
 bool 
------
 t
(1 row)

select true is not false;
 ?column? 
----------
 t
(1 row)

注意你也可以将整体投注到bool:

select 1::bool;
 bool 
------
 t
(1 row)

select 2::bool;
 bool 
------
 t
(1 row)

select 0::bool;
 bool 
------
 f
(1 row)

显然,这些软件包的两位作者对如何解决布尔类型问题有不同的看法。