Возвращаемое значение diff между Postgres и MySql для логических значений - PullRequest
2 голосов
/ 14 июня 2011

Если я сделаю это:

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

на Postgres и MySql я получаю это:

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

Может кто-нибудь объяснить, о чем это?!

1 Ответ

0 голосов
/ 21 марта 2013

Независимо от того, где ошибка, это показывает интересное различие между двумя базами данных (и пример того, почему перекрестная абстракция базы данных сложна).

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)

Очевидно, что два автора этих пакетов имели разные идеи о том, как решить вопрос о булевых типах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...