ブログ・エス技研

当ブログは引越しをしました。10秒後に自動で転送しますが、転送されない場合は、http://blog.s-giken.net/ をご覧ください。
ブログ・エス技研 TOP  >  スポンサー広告 >  MySQL >  MySQLの「tinyint(1)」の悲劇 Boolean型になるとは...

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
[ --年--月--日 --:-- ] カテゴリ:スポンサー広告 | TB(-) | CM(-)

MySQLの「tinyint(1)」の悲劇 Boolean型になるとは...

CakePHPのプログラムを作っていて、登録された値が想定していた値にならず困っていました。
まだまだ CakePHPの初心者の私はプログラムの記述が間違ってるのだとさんざん悩んでいました。

登録する項目は下記の「authority」の項目に「1:システム管理者」「2:マネージャー」「3:オペレーター」「4:一般ユーザ」といった 4種類の権限を保存するというものでした。

------------------------
CREATE TABLE IF NOT EXISTS `users` (


`authority` tinyint(1) NOT NULL DEFAULT '1',


) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=0 ;
------------------------

何度も何度もプログラムを見直しましたが、2、3、4のフラグを保存しようとしても、「1」としか保存されないのです。
Bakeしたものをベースに、フラグのコードをテキストに変換するために、「authority」の項目の日本語の配列を呼び込んでいるだけで、特に大きな変更はしておらず、間違えようがありませんでした。

それでも何度も見直し、変数を書き換えてみたりしながら数時間悩むことになりました...


結論!
MySQLの「tinyint(1)」は、Boolean型と同じです!

「tinyint(1)」の「(1)」は、「1桁」という意味ではなく、「1bit」という意味になります。
そのため、この項目に入るのは「0」「1」で、Boolean型と同じになります。
この辺が、例えば「varchar(255)」の「(255)」と違うために間違える原因になります。

また、詳しくは MySQLの型を調べてもらえばわかると思いますが、「tinyint」は 1バイトで「-128~127」。「int」は 8バイトで「-2147483648~2147483647」が入ります。

「tinyint(2)」や「int(6)」といった設定をしてもその桁数の数値が保存されるわけではないため、tinyint、intの場合は「(n)」の設定をする必要がありません。(意図して設定する場合は別ですが。)

逆に、桁数を指定して設定をしたい場合は、DECIMAL型(NUMERIC型も同じ意味)を使い、「DECIMAL(5,2)」のように指定すべきでしょう。
「DECIMAL(5,2)」は、総桁数 5桁で、小数点以下 2桁(整数 3桁、小数点以下 2桁)という意味になります。

また、下記のサイトなども参考になりますので、併せて読んでいただければ理解が深まると思います。

MySQLの型で気になった(tinyint,int) (3)
http://plaza.rakuten.co.jp/hknopage/diary/200903240000/
MySQL 5.1 の boolean 型を検証
http://1000g.5qk.jp/2010/11/15/mysql5-1%E3%81%AEboolean%E5%9E%8B%E3%82%92%E6%A4%9C%E8%A8%BC/
スポンサーサイト
[ 2013年07月11日 20:21 ] カテゴリ:MySQL | TB(0) | CM(2)
結論が間違っています
MySQLの「tinyint(1)」には-128~127の値が格納できます。

>2、3、4のフラグを保存しようとしても、「1」としか保存されない
のは、SQLが間違っているためだと思われます。

以下はとっても簡単なテストSQL
--------------------------------------------
DROP TABLE IF EXISTS `test`;
CREATE TABLE `test` (
`flg` tinyint(1) NOT NULL,
`name` varchar(32) NOT NULL
) ;


INSERT INTO `test` (`flg`, `name`) VALUES
(100, '100番'),
(-128, '-128'),
(127, '127番'),
(2, '2番フラグ');
[ 2014/01/07 17:16 ] [ 編集 ]
ご指摘ありがとうございました。
ご指摘のコメント、ありがとうございます。
また、間違って理解していましたので非常に助かりました。ありがとうございました。

ご指摘の件、改めて動作検証しましたところ、この記事の一件は MySQLの処理に起因するのではなく、CakePHPの処理に起因することが分かりました。

また、MySQLのフィールドに「tinyint(1)」を設定すると、MySQLは Boolean型として処理されますが、データは -128~127までの数値で入っている入っているようです。


また、この件に関して、改めて検証しましたので、改めて記事として対応させて頂こうと思っています。
ありがとうございました。
[ 2014/01/13 00:14 ] [ 編集 ]
コメントの投稿












管理者にだけ表示を許可する
トラックバック
この記事のトラックバックURL

プロフィール

エス技研

Author:エス技研
性別:男性
職業:Web系エンジニア
エンジニアになって 15年ほど経ちますが、その途中で 5年ほどディレクタ、マネジメントを中心とした業務を行っていたためにやや現場を離れていましたが、転職をきっかけに 2012年に現場に復帰し、新たな技術を楽しみながら勉強しています。
メインの環境は LAMP環境です。

FC2ブログランキング
FC2カウンター
FC2拍手ランキング
GoogleAdWords
カレンダー
06 | 2017/07 | 08
- - - - - - 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 - - - - -
検索フォーム
ブロとも申請フォーム
QRコード
QR
フリーエリア


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。