如果我这样做:
ActiveRecord::Base.connection.execute('select 1 as t').first
在Postgres和MySql上我得到了这个:
MySql: [1]
Postgres: {"t"=>"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)
显然,这些软件包的两位作者对如何解决布尔类型问题有不同的看法。