MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

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でブール値を扱うには、BOOLBOOLEAN、または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);
}

コードのスナップショット:

PHPとMySQLでブール値を扱うには?BOOL・BOOLEAN・TINYINT(1)の違いと使い方

出力結果:

PHPとMySQLでブール値を扱うには?BOOL・BOOLEAN・TINYINT(1)の違いと使い方

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);
}

コードのスナップショット:

PHPとMySQLでブール値を扱うには?BOOL・BOOLEAN・TINYINT(1)の違いと使い方

出力結果:

PHPとMySQLでブール値を扱うには?BOOL・BOOLEAN・TINYINT(1)の違いと使い方

まとめ

MySQLには独立したブール型は存在せず、BOOLやBOOLEANは内部的にTINYINT(1)へ変換されます。trueは1、falseは0として格納されるため、PHP側でも同じ数値表現でシームレスに扱えます。実務では、意図を明確にするためにBOOLEANキーワードを使用しつつ、内部的にはTINYINT(1)として動作することを理解しておくとよいでしょう。

  1. MySQLで1つのINSERT文を使って列に複数の値を一括挿入する方法

    はじめにMySQLでは、1つのINSERT文を繰り返し実行しなくても、単一のクエリだけで同じ列に複数の値を挿入できます。VALUES句の後ろに、挿入したい値をカンマ区切りのタプル(行)として列挙するだけです。この方法はデータベースへの接続回数を減らせるため、大量のデータを登録する際にパフォーマンス面でも大きなメリットがあります。基本構文複数の値を1つの列に挿入する場合の基本構文は以下のとおりです。INSERT INTO テーブル名 VALUES(値1),(値2),...,(値N);このように、各値を丸括弧で囲み、カンマ(,)で区切って並べることで、1回のクエリで複数行をまとめて挿入できます。実

  2. PHPで配列からnull値を削除する方法【array_filter()の使い方】

    PHPで配列からnull値を削除したい場合は、array_filter()関数を使用します。この関数は配列の各要素をフィルタリングし、条件に合わない値を自動的に取り除いてくれます。 array_filter()の基本動作 array_filter()は、コールバック関数を使って配列を絞り込む関数です。コールバックを省略した場合は、「falseと同等(falsy)」と判定されるすべての要素が削除されます。そのため、nullだけでなく、0、空文字列 ""、false、空の配列なども同時に除去される点に注意しましょう。 まず、次のような連想配列を用意します。 $studen