MySQL、CakePHP 2.3で「tinyint(1)」の Boolean型の動作を再確認
2018/03/21
MySQL、CakePHPで「tinyint(1)」のフィールドは Boolean型として認識
MySQLでの「tinyint(1)」のフィールドは Boolean型と認識するが...
MySQLの「tinyint(1)」の悲劇 Boolean型になるとは...
この記事に「結論が間違っています」コメントをいただきました。
そのために検証を行った結果、「tinyint(1)」のフィールドが「Boolean型」として処理されるのは MySQLの機能ではなく、CakePHPの機能によって起こっていることを確認しました。
※厳密な表現では、MySQLでは「tinyint(1)」で設定されたフィールドは Boolean型として処理する仕様となっているため、その定義に従って、CakePHPでは「0」「1」しか持てないように処理している、ということになるでしょう。
MySQLの定義については以下参照
http://dev.mysql.com/doc/refman/5.1/ja/numeric-type-overview.html
また、コメントでご指摘をいただいた通り、「tinyint(1)」を設定していても MySQLのテーブル上は -128~127まで保存されることを確認しました。
そして、「0」の場合は「False」、「0」以外の場合は「True」として扱うものと定義してあるようです。
Cakephpでの「tinyint(1)」のフィールドの扱い方
しかし、それを CakePHPで処理をするとちょっと違う結果になることを改めて確認しました。
具体的には、下記の様にテーブルを作成し、このテーブルをもとに CakePHPの bakeコマンドにて、Model、Controller、Viewを作成し、データの登録、一覧表示を行ってみました。
——————————————–
1 2 3 4 5 6 7 8 9 10 |
CREATE TABLE IF NOT EXISTS `testints` ( `id` int(11) NOT NULL AUTO_INCREMENT, `test1` tinyint(4) NOT NULL, `test2` smallint(6) NOT NULL, `test3` int(11) NOT NULL, `test4` bigint(20) NOT NULL, `created` datetime DEFAULT NULL, `modified` datetime DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; |
——————————————–
この状態でデータを登録すると、当たり前ですがデータは問題なく「-128」~「127」まで問題なく登録できました。
その次に、phpMyAdminなどで、test1の項目を「tinyint(1)」に変えてみたところ、大きな変化が現れました。
まず、一覧画面。
変更前
変更後
それまで -128、127などが編集されていた項目が「1」になり、0が編集されていた項目は nullに変わってしまいました。
また、入力画面では、通常のテキスト入力項目だったものが、チェックボックスの項目に変わってしまうという自動処理が行われていました。
変更前
変更後
Cakephpで入力形式を変えてみた場合
これをもとのテキスト形式の入力に戻す場合は、「/app/View/Testints/add.ctp」の 6行目に下記の様に「, array ( ‘type’ => ‘text’ )」を追加することでテキスト形式の入力に戻すことは可能です。
———————–
1 |
echo $this->Form->input('test1', array ( 'type' => 'text' ) ); |
———————–
ですが、テキスト形式で入力できるようにしたとして 0以外の数値が入力されてもデータベースには 1として保存されますので、実質 Boolean型としてしか使えませんので注意が必要です。
これが、前回の記事「MySQLの「tinyint(1)」の悲劇 Boolean型になるとは...」で陥っていたトラブルの原因でした。
そして、これは MySQLの Boolean型としての定義を、CakePHPの機能によって Boolean型としての処理として実装しているということが今回の実験で判明しました。
「tinyint(1)」以外の項目をチェック
さらに実験をしてみたところ、「tinyint(1)」以外の「「tinyint(2)」「tinyint(3)」では「tinyint(1)」のような変化はなく、「smallint(1)」「int(1)」も「tinyint(1)」のような変化はありませんでした。
ただ、「bigint」はさらなる衝撃な動作をしました。
なんと、「bigint(1)」のように設定すると、設定した数値の桁数分だけしか入力できなくなるのです。
例えば、
「bigint(1)」ならば、1桁しか入力できませんので「0~9」まで。
「bigint(2)」ならば、2桁しか入力できませんので「-9~99」まで。
といった感じ。
つまり、設定した数値の値に従って、入力エリアに自動的に「maxlength」が設定されるようです。(HTMLのソース上に maxlengthが設定してあるのを確認しました。)
ですが、これはあくまでも入力画面における処理であり、「tinyint(1)」の処理とは違うようで、下記の様に入力タイプを「text」と明示して設定すると、「maxlength」の制限はなくなり、通常通り「bigint(20)」と変わらない動きになりました。
また、入力画面上のみの処理のため、あらかじめ入力されていたデータは「tinyint(1)」の様に加工されることなくそのまま表示されていました。(入力画面でも入力されている値がそのまま表示されていました。)
———————–
1 |
echo $this->Form->input('test4', array ( 'type' => 'text' ) ); |
———————–
「tinyint(1)」の MySQL、CakePHPでの動作のまとめ
今回は、tinyint、smallint、int、bigintの 4つの型での検証ですが、その他の項目でも同じような動きをする項目があるかもしれません。
もし、そんなことをご存知の方がいらっしゃいましたら、情報提供をしていただけますと幸いです。
ちなみに、当然ですが「tinyint(0)」は設定することができません。
tinyint()を始め、MySQLの数値型についての詳細は、下記に解説記事を書いていますので、あわせて参照してください。
MySQLの数値型(int、tinyint、bigint、decimal、number、float)の解説
GoogleAdwords
GoogleAdwords
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!
関連記事
-
-
Windows環境の XAMPPを利用して CakePHPの開発する際の注意点
WindowsベースにXAMPPで環境を構築しCakePHP4を利用したWebシステムを構築する際は、大文字と小文字の違いを意識する必要がある。LinuxベースのWebサーバに移動させたときに不具合で動作しないこともある。
-
-
CakePHPで同一テーブル内の値を比較する条件でレコードを取得する方法
CakePHPの同一テーブルにある項目の値を比較し条件に合致するレコードを取得する方法を解説。[”項目名”=>”値”]ではなく[”項目名 = 項目名”]と書くところがポイント。
-
-
CakePHP3でQRコードを作成、表示するライブラリ「cakePHP-QR-Code-Helper」
CakePHPでQRコードを生成するライブラリ「cakePHP-QR-Code-Helper」の紹介。GDライブラリのインストールも必要ないHelperとして提供されているため、ファイルを設置すればすぐに使用可能。
-
-
CakePHP3のfriendsofcake/searchでツリーカテゴリーの子階層も含めて検索する方法
CakePHP3のツリービヘイビアを使ったツリーカテゴリーの子階層も含めての検索を検索プラグイン「friendsofcake/search」を使って実現する方法を解説しました。
-
-
CakePHP3でkeywords、DescriptionをHTMLヘルパーを使って設定する
CakePHP3のkeywordsとdescriptionを設定する方法の解説。CakePHP3にはmetaタグを編集するHTMLヘルパーが用意されているためそれを利用すればOK!ポイントはブロック化を有効にすること。
-
-
VirtualBoxにCakePHP3を設置。必要なCentOS、Apache、PHP、MySQL、Composerをインストールし設定する
VirtualBoxにCentOS、Apache、MySQL、PHPをインストールするところから初めてCakePHP3の開発環境を構築する手順を詳細解説。この記事1つで全ての設定が完了する。
-
-
CakePHP3でシェルを作成しコマンドラインから実行・CakePHP2との違い
CakePHP3のシェルスクリプトを作成し、コマンドラインから実行する方法を解説。複数単語をつなげる場合の対応方法がCakePHP2より制限が厳しくなったのでCakePHP3の命名規則の確認が必要だ。
-
-
CakePHP3のcontroller内でテンプレート、レイアウトを変更する際の指定方法
CakePHP3でテンプレートファイルやレイアウトファイルをデフォルトのものから別のものに変更したい場合の指定方法を解説。
-
-
CakePHP4のCSS、JavaScript、画像のブラウザへのキャッシュをコントロールする
CakePHP4、CakePHP3でブラウザにキャッシュさせる設定の解説。CSS、JavaScript、画像をブラウザにキャッシュさせるのか、定期的にリロードする設定にするのかの設定が可能。
-
-
URL短縮サービス「TTTオンライン(https://ttt.onl)」公開
URL短縮サービス「TTTオンライン(https://ttt.onl)」を公開。メールやSNSでは使いにくい長いURLを短いURLに変換するサービス。QRコードも。Google URL Shortenerが2019年3月にサービス終了。