MySQL WorkbenchでBoolean型が設定できない理由と対処法

こんにちは。ゆうせいです。


MySQL Workbenchを使ってテーブル設計をしていると、「Boolean型(真偽値)を設定しようとしたのに、勝手にTINYINT(1)に変わった!」という経験、ありませんか?

この記事では、なぜMySQLでBoolean型が直接使えないのか? そして代わりにどうすればいいのか? を、図解や具体例を交えて、わかりやすく解説します。


なぜBoolean型が使えないの?

実は、MySQLには「本物のBoolean型」が存在しない

これは意外かもしれませんが、MySQLには専用のBoolean型はありません

MySQLでは BOOLEAN または BOOL を指定すると、自動的に TINYINT(1) に変換されます
つまり、内部的には整数(0か1)として扱われるのです。

例で確認!

CREATE TABLE sample (
    is_active BOOLEAN
);

このSQLを実行すると、実際には次のようなテーブルができます。

CREATE TABLE sample (
    is_active TINYINT(1)
);

つまり「Booleanと書けるけど、実際には整数として保存してるよ」というのがMySQLの仕様です。


なぜこのような仕様になっているの?

他のデータベースとの互換性のため

多くのRDBMS(リレーショナル・データベース・マネジメント・システム)には、明示的なBoolean型が存在します。
例:PostgreSQLやSQL Serverなど。

MySQLはそれらとの互換性をある程度持たせるために、BOOLEANBOOLというキーワードを「別名」として受け入れています。

でも、実態は TINYINT(1) なんですね。


Booleanの代わりにどうすればいい?

結論:TINYINT(1) を使うのが正しい

実務でも、MySQLでは次のように定義するのが一般的です。

is_deleted TINYINT(1) DEFAULT 0
  • 0 → 偽(false)
  • 1 → 真(true)

Booleanっぽく見せかけてるけど実態は数値という感じですね。

補足:ENUM型はおすすめしない理由

たまに「ENUM('true', 'false')」のように文字列で管理するケースもありますが、以下の理由でおすすめしません。

項目内容
パフォーマンス遅くなる(比較処理が重い)
データ整合性大文字・小文字の揺れが起こりやすい
可読性true/falseが「文字列」として扱われる違和感

MySQL WorkbenchでBooleanを設定するコツ

手順

  1. カラムのデータ型を「TINYINT」に手動で設定する
  2. 長さを「1」にしておく
  3. デフォルト値(0または1)を必要に応じて設定

画面上は「Boolean」が選べる?

WorkbenchのGUI上では「Boolean」という選択肢があるように見えることもありますが、それは見た目だけの便宜的な設定です。
実際のDDL(CREATE文)を見ると、やっぱり TINYINT(1) に変換されているのが分かります。


まとめ

項目内容
MySQLにBoolean型はある?ない(TINYINT(1)として扱われる)
BOOLEANと書くとどうなる?自動でTINYINT(1)に変換される
本物のBoolean型を使いたいときは?PostgreSQLなど他のRDBMSを検討する
対応策TINYINT(1)で0と1を使って管理する

今後の学習の指針

MySQLの「表向きの型」と「内部での実装の違い」は他にもあります。次は以下のトピックも学んでみてください!

  • ENUM型VARCHAR型の違い
  • NULLとNOT NULLの扱いの落とし穴
  • CHECK制約がMySQLでうまく動かない理由

「どうしてこうなるの?」と疑問に思ったら、公式ドキュメントやSQLの出力結果をじっくり見てみるクセをつけると理解が深まりますよ!

質問があればいつでも聞いてくださいね。


セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク

投稿者プロフィール

山崎講師
山崎講師代表取締役
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。