2017-11-13 15 views
0

テーブルの列がTINYINTの場合、私はこの奇妙な問題に直面しています。私は私のローカルのテーブルを照会するときに、真または偽の列値を持つレコードを取得します。私はプロダクションにコードを入れ、時には真偽値を取得します。しかし、突然値がtrueまたはfalseから0または1に切り替わります。なぜこれが起こるのか分かりません。この問題に関する洞察はすばらしいことでしょう。TINYINT列の値がtrueに切り替わり、1

私のTINYINT列の値は、1または0のみです。

@content_map: {1=>true, 338=>true, 375=>false} 

ローカルでハッシュは上記のようになります。

は、だから私がどのように見えるすべてのキーに対して私は、対応するTINYINT列の値を格納していますここで、レコードから作成しています。このハッシュがあります。

生産では、ハッシュは以下のようになります。

@content_map: {1=>true, 338=>true, 375=>false} 

、時にはのようないくつかのリロード後:

@content_map: {1=>0, 338=>1, 375=>0} 

だからハッシュ値が生産に変化し続ける、これは私が理解していないものです。それは常に真でなければいずれか、またはそれは常に私が@cotent_mapを作成していますどのように1

次のようになります。ここでは

@content_map = Hash.new 

は、列を持つテーブル上の選択クエリは、型TINYINT

@list = Action.all.select("id, free") 

@list.map {|i| @content_map[i.id] = i.free} 
の自由です
+1

「@ content_map」はどのように取得していますか? – tadman

答えて

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)のための同義語あります。 0の値は、 とみなされます。ゼロ以外の値が真であると見なされています。

そして、もっとクレイジーな部分

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」が返されます。 Thanksgod、それはなかった - ))

mysql> select true != false; 
+---------------+ 
| true != false | 
+---------------+ 
|    1 | 
+---------------+ 
1 row in set (0,00 sec) 

結論:

MySQLのエンジン自体も真実が何であるかを知らないが、虚偽ではないものを、ゼロ以外の何、ゼロでないとして何を考えるべきですそのような問題に一貫性があるとは期待しないでください))

+0

これは技術的には正しいですが、Railsはこれを抽象化しています。モデルの属性を 'boolean'として宣言すると、Railsはそれを' tinyint'として保存しますが、コードに 'boolean'を与えます。 – ArtOfCode

関連する問題