PHPとMySQLでブール値を扱うには?BOOL・BOOLEAN・TINYINT(1)の違いと使い方
本記事では、MySQL 8.0.12を使用して、ブール(Boolean)値の正しい取り扱い方を解説します。まず、使用しているMySQLのバージョンを確認しておきましょう。
mysql> select version(); +-----------+ | version() | +-----------+ | 8.0.12 | +-----------+ 1 row in set (0.00 sec)
MySQLにおけるブール値の基本:BOOL・BOOLEAN・TINYINT(1)
MySQLでブール値を扱うには、BOOL、BOOLEAN、またはTINYINT(1)のいずれかを使用します。実は、BOOLやBOOLEANを指定した場合、MySQLはこれらを内部的にTINYINT(1)へ自動的に変換します。つまり、MySQLには独立したブール型は存在せず、その実体はすべてTINYINT(1)だということです。
さらに、BOOL・BOOLEANデータ型では、trueリテラルはPHPやC/C++言語と同じように1として表現され、falseリテラルは0として表現されます。
BOOLEANがTINYINT(1)に変換されることを実際に確認する
それでは、MySQLがBOOLやBOOLEANをTINYINT(1)に変換していることを証明するために、BOOLEAN型のカラムを持つテーブルを作成してみましょう。テーブル作成のクエリは以下の通りです。
mysql> create table BoolOrBooleanOrTinyintDemo
-> (
-> Id int NOT NULL AUTO_INCREMENT,
-> isvalidAddress BOOLEAN,
-> PRIMARY KEY(Id)
-> );
Query OK, 0 rows affected (0.74 sec)
SHOW CREATE TABLEでDDLを確認する
続いて、SHOW CREATEコマンドを使用して、作成したテーブルのDDL(定義情報)を確認します。
mysql> show create table BoolOrBooleanOrTinyintDemo\G
出力結果は以下の通りです。
*************************** 1. row ***************************
Table: BoolOrBooleanOrTinyintDemo
Create Table: CREATE TABLE `boolorbooleanortinyintdemo` (
`Id` int(11) NOT NULL AUTO_INCREMENT,
`isvalidAddress` tinyint(1) DEFAULT NULL,
PRIMARY KEY (`Id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)
注目すべきはisvalidAddressカラムです。定義時にはBOOLEANと指定しましたが、DDLを確認するとtinyint(1)へ内部変換されていることがわかります。
true/falseリテラルの挙動を検証する
次に、trueリテラルが1として、falseリテラルが0として保存されることを確認しましょう。trueとfalseの値を持つレコードをいくつか挿入します。
mysql> insert into BoolOrBooleanOrTinyintDemo(isvalidAddress) values(true); Query OK, 1 row affected (0.43 sec) mysql> insert into BoolOrBooleanOrTinyintDemo(isvalidAddress) values(false); Query OK, 1 row affected (0.17 sec) mysql> insert into BoolOrBooleanOrTinyintDemo(isvalidAddress) values(true); Query OK, 1 row affected (0.29 sec) mysql> insert into BoolOrBooleanOrTinyintDemo(isvalidAddress) values(false); Query OK, 1 row affected (0.12 sec) mysql> insert into BoolOrBooleanOrTinyintDemo(isvalidAddress) values(true); Query OK, 1 row affected (0.33 sec)
SELECT文を使って、テーブル内のすべてのレコードを表示します。
mysql> select *from BoolOrBooleanOrTinyintDemo;
出力結果は以下の通りです。
+----+----------------+ | Id | isvalidAddress | +----+----------------+ | 1 | 1 | | 2 | 0 | | 3 | 1 | | 4 | 0 | | 5 | 1 | +----+----------------+ 5 rows in set (0.00 sec)
上記の出力結果を見ると、trueが1として、falseが0として保存されていることが確認できます。
PHPにおけるブール値の扱い
PHPでも同様に、trueは1として、falseは0として表現されます。そのため、MySQLとPHPの間でブール値をやり取りする際も、数値表現が一致しておりスムーズに連携できます。
trueの場合の動作
以下のPHPコードでは、変数「isValidAddress」に値1を設定しています。この場合、if条件はtrueと評価され、if文の本体のみが実行されます。
$isValidAddress = 1;
if($isValidAddress)
{
echo 'true is represented as ';
echo ($isValidAddress);
}
else
{
echo 'false is represented as ';
echo ($isValidAddress);
}
コードのスナップショット:

出力結果:

falseの場合の動作
次に、変数「isValidAddress」の値を0に変更します。この場合、if条件はfalseと評価され、else文の本体のみが実行されます。コードは以下の通りです。
$isValidAddress=0;
if($isValidAddress)
{
echo 'true is represented as ';
echo ($isValidAddress);
}
else
{
echo 'false is represented as ';
echo ($isValidAddress);
}
コードのスナップショット:

出力結果:

まとめ
MySQLには独立したブール型は存在せず、BOOLやBOOLEANは内部的にTINYINT(1)へ変換されます。trueは1、falseは0として格納されるため、PHP側でも同じ数値表現でシームレスに扱えます。実務では、意図を明確にするためにBOOLEANキーワードを使用しつつ、内部的にはTINYINT(1)として動作することを理解しておくとよいでしょう。
-
MySQLで1つのINSERT文を使って列に複数の値を一括挿入する方法
はじめにMySQLでは、1つのINSERT文を繰り返し実行しなくても、単一のクエリだけで同じ列に複数の値を挿入できます。VALUES句の後ろに、挿入したい値をカンマ区切りのタプル(行)として列挙するだけです。この方法はデータベースへの接続回数を減らせるため、大量のデータを登録する際にパフォーマンス面でも大きなメリットがあります。基本構文複数の値を1つの列に挿入する場合の基本構文は以下のとおりです。INSERT INTO テーブル名 VALUES(値1),(値2),...,(値N);このように、各値を丸括弧で囲み、カンマ(,)で区切って並べることで、1回のクエリで複数行をまとめて挿入できます。実
-
PHPで配列からnull値を削除する方法【array_filter()の使い方】
PHPで配列からnull値を削除したい場合は、array_filter()関数を使用します。この関数は配列の各要素をフィルタリングし、条件に合わない値を自動的に取り除いてくれます。 array_filter()の基本動作 array_filter()は、コールバック関数を使って配列を絞り込む関数です。コールバックを省略した場合は、「falseと同等(falsy)」と判定されるすべての要素が削除されます。そのため、nullだけでなく、0、空文字列 ""、false、空の配列なども同時に除去される点に注意しましょう。 まず、次のような連想配列を用意します。 $studen