MariaDBにおけるBOOLEANの全て:データ型からトラブルシューティング、代替案まで

2025-05-27

MariaDBにおけるBOOLEANとは?

MariaDB(およびMySQL)では、BOOLEAN型は実際にはTINYINT(1)型の**エイリアス(別名)**として扱われます。これはつまり、BOOLEAN型のカラムを作成すると、データベースの内部ではTINYINT(1)型のカラムとして扱われるということです。

  • TINYINT(1)とは? TINYINTは非常に小さい整数を格納するためのデータ型で、通常は-128から127までの符号付き整数、または0から255までの符号なし整数を格納できます。 括弧内の(1)は「表示幅」を示しており、通常は1桁の表示を意味しますが、格納される値の範囲には直接影響しません。ただし、慣習的にTINYINT(1)はブール値を意図していることを示すために使われます。

BOOLEANの動作

MariaDBでは、BOOLEAN型のカラムに値を挿入したり、比較したりする際に、以下のルールが適用されます。

  • 真偽の判断

    • 値が0の場合は**偽(FALSE)**とみなされます。
    • 値が0以外の場合は**真(TRUE)**とみなされます。 これは、BOOLEAN型として定義されたカラムに10だけでなく、例えば2-5などの0以外の数値を挿入することも可能であることを意味します。ただし、これらの0以外の値はすべて論理的にはTRUEとして扱われます。
    • TRUEは数値の1として扱われます。
    • FALSEは数値の0として扱われます。 これらのキーワードは、それぞれ10のエイリアスです。

テーブル定義の例:

CREATE TABLE users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(255),
    is_active BOOLEAN -- 実際には TINYINT(1) として扱われる
);

データの挿入例:

INSERT INTO users (name, is_active) VALUES ('Alice', TRUE);
INSERT INTO users (name, is_active) VALUES ('Bob', FALSE);
INSERT INTO users (name, is_active) VALUES ('Charlie', 1); -- TRUEと同じ
INSERT INTO users (name, is_active) VALUES ('David', 0); -- FALSEと同じ
INSERT INTO users (name, is_active) VALUES ('Eve', 5); -- TRUEとして扱われる

データの選択と真偽の評価:

SELECT name, is_active FROM users WHERE is_active = TRUE;
-- is_active が 1, 5 など 0 以外のレコードが選択されます。
-- 結果は Alice, Charlie, Eve となります。

SELECT name, is_active FROM users WHERE is_active = FALSE;
-- is_active が 0 のレコードが選択されます。
-- 結果は Bob, David となります。

SELECT name, IF(is_active, 'アクティブ', '非アクティブ') AS status FROM users;
-- is_active が 0 以外なら「アクティブ」、0なら「非アクティブ」と表示されます。


BOOLEAN 型が数値として返される/認識される

問題
アプリケーション(特にPHPなどの動的型付け言語)から MariaDB の BOOLEAN カラムの値を読み取ると、true/false ではなく 1/0 の数値として返されることがあります。これにより、アプリケーション側でブール値としての適切な扱いができない場合があります。

原因
MariaDB の BOOLEAN は、前述の通り内部的に TINYINT(1) です。データベースドライバーやORM(Object-Relational Mapper)によっては、このカラムを純粋な数値型として解釈し、生の数値(1 または 0)を返すことがあります。

トラブルシューティング

  • MariaDB の JDBC ドライバの設定 (Javaの場合)
    Java の JDBC ドライバを使用している場合、tinyInt1isBit=false のような接続オプションが設定されていると、TINYINT(1)BIT ではなく TINYINT として扱われ、ブール値として認識されないことがあります。このオプションを true に設定するか、削除することで解決する場合があります。
  • ORM やデータベースライブラリの設定
    使用しているORMやデータベース接続ライブラリに、特定のカラムをブール値として扱う設定オプションがあるか確認してください。例えば、一部のライブラリでは、カラムの型をスキーマから推測して自動的に型変換を行う機能があります。
  • アプリケーション側での型変換
    最も一般的な解決策は、アプリケーション側で明示的に型変換を行うことです。例えば、PHP であれば (bool) キャストを使用します。
    // $row['is_active'] が '1' または '0' の文字列、あるいは整数として返される場合
    $isActive = (bool)$row['is_active'];
    if ($isActive) {
        // 真の処理
    } else {
        // 偽の処理
    }
    

TRUE/FALSE 以外の値の挿入

問題
BOOLEAN 型のカラムに 10 以外の数値を挿入できてしまい、期待通りの真偽値として扱われない可能性があります。例えば、is_active カラムに 5 を挿入してもエラーにならず、SELECT * FROM users WHERE is_active = TRUE; で取得されてしまうことがあります。

原因
BOOLEANTINYINT(1) のエイリアスであるため、TINYINT が受け入れる任意の数値(-128 から 127、または 0 から 255)を格納できてしまいます。MariaDB は 0FALSE0 以外を TRUE と解釈します。

トラブルシューティング

  • CHECK 制約の使用 (MariaDB 10.2.1 以降)
    MariaDB 10.2.1 以降では、CHECK 制約を使用してカラムに格納できる値を制限できます。これにより、データベースレベルで不正な値の挿入を防ぐことができます。
    CREATE TABLE users (
        id INT PRIMARY KEY AUTO_INCREMENT,
        name VARCHAR(255),
        is_active BOOLEAN,
        CHECK (is_active IN (0, 1)) -- 0 または 1 のみ許可
    );
    
    既存のテーブルに追加する場合:
    ALTER TABLE users ADD CONSTRAINT chk_is_active CHECK (is_active IN (0, 1));
    
  • アプリケーション側での入力検証
    データベースに値を挿入する前に、アプリケーション側で入力値を厳密に検証し、true または false(あるいは 1 または 0)のみを許可するようにします。

他のデータベースシステムとの互換性問題

問題
MariaDB とは異なるデータベース(PostgreSQL, SQL Serverなど)を併用している場合、各データベースのブール値の扱いの違いにより、アプリケーションの移植やデータ移行で問題が生じることがあります。

原因
SQL標準には BOOLEAN 型が存在しますが、各データベースシステムでの実装は異なる場合があります。MariaDB/MySQL は TINYINT(1) でエミュレートしていますが、PostgreSQL は真の BOOLEAN 型を持ち、SQL Server は BIT 型を使用することが一般的です。

トラブルシューティング

  • アプリケーションロジックの調整
    異なるデータベース間でアプリケーションを切り替える必要がある場合、データベースドライバーや接続設定に応じて、ブール値の取得と設定のロジックを条件分岐させる必要があるかもしれません。
  • 共通のデータ型への変換
    データ移行の際は、MariaDB の BOOLEAN を移行先のデータベースの適切なブール型に変換するためのスクリプトやツールを使用します。通常、0FALSE に、1TRUE にマッピングします。
  • 抽象化レイヤーの利用
    ORM やデータベース抽象化ライブラリを使用することで、各データベースシステム固有の型の違いを吸収し、アプリケーションコードから抽象化された方法でブール値を扱えるようになります。

問題
BOOLEAN カラムが NULL を許可するように定義されている場合、真でも偽でもない「不明」な状態が発生します。アプリケーションによっては、NULL をブール値として適切に扱えないことがあります。

原因
MariaDB の BOOLEAN (TINYINT(1)) はデフォルトで NULL を許可します。NULLTRUE でも FALSE でもなく、比較演算 (= TRUE, = FALSE) でも特別な振る舞いをします。

トラブルシューティング

  • IS TRUE / IS FALSE / IS NULL の使用
    SQL クエリで NULL 値を適切に扱うためには、WHERE is_active IS TRUEWHERE is_active IS FALSEWHERE is_active IS NULL といった構文を使用します。
    • is_active = TRUEis_active1 の場合に真となります。(NULL は偽)
    • is_active IS TRUEis_active0 以外の値の場合に真となります。(15 など。NULL は偽)
    • is_active IS FALSEis_active0 の場合に真となります。(NULL は偽)
    • is_active IS NOT TRUEis_active0 または NULL の場合に真となります。
    • is_active IS NOT FALSEis_active0 以外の値または NULL の場合に真となります。
  • NOT NULL 制約の追加
    通常、ブール値は真か偽のどちらかであるべきなので、BOOLEAN NOT NULL としてカラムを定義し、デフォルト値を設定することをお勧めします。
    CREATE TABLE users (
        id INT PRIMARY KEY AUTO_INCREMENT,
        name VARCHAR(255),
        is_active BOOLEAN NOT NULL DEFAULT FALSE -- NULL を許可せず、デフォルトは偽
    );
    

MariaDB の BOOLEAN 型は、その柔軟性ゆえに「期待通りのブール値として振る舞わない」という問題がよく発生します。ほとんどの場合、これは TINYINT(1) のエイリアスであるという事実と、各レイヤー(データベースドライバー、ORM、アプリケーションロジック)での型解釈の違いに起因します。



データベースの準備

まず、以下のテーブルを作成します。

CREATE DATABASE IF NOT EXISTS myapp_db;

USE myapp_db;

CREATE TABLE IF NOT EXISTS users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(255) NOT NULL,
    is_active BOOLEAN NOT NULL DEFAULT TRUE, -- BOOLEAN は TINYINT(1) のエイリアス
    email VARCHAR(255) UNIQUE
);

-- サンプルデータの挿入
INSERT INTO users (name, is_active, email) VALUES
('Alice', TRUE, '[email protected]'),
('Bob', FALSE, '[email protected]'),
('Charlie', 1, '[email protected]'), -- TRUE と同じ
('David', 0, '[email protected]'),   -- FALSE と同じ
('Eve', TRUE, '[email protected]');

PHP での例

PHP では、MariaDB から取得した TINYINT(1) の値が文字列 '1' または '0' として返されることがよくあります。明示的な型変換が必要です。

<?php

$servername = "localhost";
$username = "root";
$password = "your_password"; // MariaDB のパスワードを設定
$dbname = "myapp_db";

// データベース接続
$conn = new mysqli($servername, $username, $password, $dbname);

// 接続チェック
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}

echo "<h3>MariaDB PHP Example</h3>";

// --- データ挿入例 ---
echo "<h4>データ挿入</h4>";
$stmt = $conn->prepare("INSERT INTO users (name, is_active, email) VALUES (?, ?, ?)");
$name = "Frank";
$isActive = true; // PHP の true は MariaDB で 1 に変換される
$email = "[email protected]";
$stmt->bind_param("sis", $name, $isActive, $email); // 's'はstring, 'i'はinteger

if ($stmt->execute()) {
    echo "新しいレコードが正常に作成されました (Frank)<br>";
} else {
    echo "エラー: " . $stmt->error . "<br>";
}
$stmt->close();

$name = "Grace";
$isActive = false; // PHP の false は MariaDB で 0 に変換される
$email = "[email protected]";
$stmt = $conn->prepare("INSERT INTO users (name, is_active, email) VALUES (?, ?, ?)");
$stmt->bind_param("sis", $name, $isActive, $email);
if ($stmt->execute()) {
    echo "新しいレコードが正常に作成されました (Grace)<br>";
} else {
    echo "エラー: " . $stmt->error . "<br>";
}
$stmt->close();


// --- データ取得とBOOLEANの扱い ---
echo "<h4>データ取得とBOOLEANの扱い</h4>";
$sql = "SELECT id, name, is_active, email FROM users";
$result = $conn->query($sql);

if ($result->num_rows > 0) {
    echo "<table border='1'>";
    echo "<tr><th>ID</th><th>名前</th><th>アクティブ? (生のDB値)</th><th>アクティブ? (PHP変換後)</th><th>メール</th></tr>";
    while($row = $result->fetch_assoc()) {
        // MariaDBから取得した is_active は '1' または '0' の文字列として返される可能性が高い
        $is_active_db_value = $row["is_active"];
        $is_active_php_bool = (bool)$row["is_active"]; // 明示的にbooleanにキャスト

        echo "<tr>";
        echo "<td>" . $row["id"] . "</td>";
        echo "<td>" . $row["name"] . "</td>";
        echo "<td>" . $is_active_db_value . "</td>";
        echo "<td>" . ($is_active_php_bool ? "はい" : "いいえ") . "</td>";
        echo "<td>" . $row["email"] . "</td>";
        echo "</tr>";
    }
    echo "</table>";
} else {
    echo "0 件の結果";
}

// --- 条件検索例 ---
echo "<h4>アクティブなユーザーの検索</h4>";
$sql_active = "SELECT name, email FROM users WHERE is_active = TRUE"; // MariaDBでは 'is_active = 1' と同じ
$result_active = $conn->query($sql_active);

if ($result_active->num_rows > 0) {
    echo "<ul>";
    while($row_active = $result_active->fetch_assoc()) {
        echo "<li>" . $row_active["name"] . " (" . $row_active["email"] . ")</li>";
    }
    echo "</ul>";
} else {
    echo "アクティブなユーザーはいません。";
}

$conn->close();

?>

Python での例 (mysql-connector-python)

Python の mysql-connector-python ライブラリは、TINYINT(1) を自動的に Python の bool 型に変換してくれることが多いです。

import mysql.connector

# データベース接続設定
config = {
    'user': 'root',
    'password': 'your_password', # MariaDB のパスワードを設定
    'host': '127.0.0.1',
    'database': 'myapp_db',
    'raise_on_warnings': True
}

try:
    conn = mysql.connector.connect(**config)
    cursor = conn.cursor()

    print("--- MariaDB Python Example ---")

    # --- データ挿入例 ---
    print("\n--- データ挿入 ---")
    add_user = ("INSERT INTO users "
                "(name, is_active, email) "
                "VALUES (%s, %s, %s)")

    # Python の True/False は MariaDB で 1/0 に変換される
    data_frank = ('Frank', True, '[email protected]')
    data_grace = ('Grace', False, '[email protected]')

    cursor.execute(add_user, data_frank)
    conn.commit()
    print("新しいレコードが正常に作成されました (Frank)")

    cursor.execute(add_user, data_grace)
    conn.commit()
    print("新しいレコードが正常に作成されました (Grace)")

    # --- データ取得とBOOLEANの扱い ---
    print("\n--- データ取得とBOOLEANの扱い ---")
    cursor.execute("SELECT id, name, is_active, email FROM users")

    print(f"{'ID':<4} | {'名前':<10} | {'アクティブ? (Python bool)':<20} | {'メール':<25}")
    print("-" * 65)
    for (id, name, is_active, email) in cursor:
        # mysql-connector-python は TINYINT(1) を自動的に Python の bool に変換することが多い
        print(f"{id:<4} | {name:<10} | {str(is_active):<20} | {email:<25}")
        # if is_active: # Python の bool としてそのまま使える
        #     print(f"  {name} はアクティブです。")

    # --- 条件検索例 ---
    print("\n--- アクティブなユーザーの検索 ---")
    cursor.execute("SELECT name, email FROM users WHERE is_active = TRUE") # MariaDBでは 'is_active = 1' と同じ

    print("アクティブなユーザー:")
    for (name, email) in cursor:
        print(f"- {name} ({email})")

except mysql.connector.Error as err:
    if err.errno == mysql.connector.errorcode.ER_ACCESS_DENIED_ERROR:
        print("ユーザー名またはパスワードが間違っています")
    elif err.errno == mysql.connector.errorcode.ER_BAD_DB_ERROR:
        print("データベースが存在しません")
    else:
        print(err)
finally:
    if 'conn' in locals() and conn.is_connected():
        cursor.close()
        conn.close()
        print("\nデータベース接続を閉じました。")

Node.js での例 (mysql2 ライブラリ)

Node.js の mysql2 ライブラリも、TINYINT(1) を JavaScript の boolean 型に自動的に変換してくれることが多いです。

const mysql = require('mysql2/promise'); // promise API を使用

// データベース接続設定
const dbConfig = {
    host: 'localhost',
    user: 'root',
    password: 'your_password', // MariaDB のパスワードを設定
    database: 'myapp_db'
};

async function runExample() {
    let connection;
    try {
        connection = await mysql.createConnection(dbConfig);
        console.log("--- MariaDB Node.js Example ---");

        // --- データ挿入例 ---
        console.log("\n--- データ挿入 ---");
        // JavaScript の true/false は MariaDB で 1/0 に変換される
        const [resultFrank] = await connection.execute(
            "INSERT INTO users (name, is_active, email) VALUES (?, ?, ?)",
            ['Frank', true, '[email protected]']
        );
        console.log(`新しいレコードが正常に作成されました (Frank): ID = ${resultFrank.insertId}`);

        const [resultGrace] = await connection.execute(
            "INSERT INTO users (name, is_active, email) VALUES (?, ?, ?)",
            ['Grace', false, '[email protected]']
        );
        console.log(`新しいレコードが正常に作成されました (Grace): ID = ${resultGrace.insertId}`);

        // --- データ取得とBOOLEANの扱い ---
        console.log("\n--- データ取得とBOOLEANの扱い ---");
        const [rows] = await connection.execute("SELECT id, name, is_active, email FROM users");

        console.log("ID   | 名前       | アクティブ? (JS boolean) | メール");
        console.log("-----|------------|-------------------------|--------------------------");
        rows.forEach(row => {
            // mysql2 は is_active (TINYINT(1)) を自動的に JS の boolean に変換することが多い
            console.log(`${String(row.id).padEnd(4)} | ${String(row.name).padEnd(10)} | ${String(row.is_active).padEnd(23)} | ${row.email}`);
            // if (row.is_active) { // JS の boolean としてそのまま使える
            //     console.log(`  ${row.name} はアクティブです。`);
            // }
        });

        // --- 条件検索例 ---
        console.log("\n--- アクティブなユーザーの検索 ---");
        const [activeUsers] = await connection.execute("SELECT name, email FROM users WHERE is_active = TRUE"); // MariaDBでは 'is_active = 1' と同じ

        console.log("アクティブなユーザー:");
        activeUsers.forEach(user => {
            console.log(`- ${user.name} (${user.email})`);
        });

    } catch (err) {
        console.error("エラーが発生しました:", err);
    } finally {
        if (connection) {
            await connection.end();
            console.log("\nデータベース接続を閉じました。");
        }
    }
}

runExample();
  • Node.js と mysql2 パッケージをインストールします。
    npm install mysql2
    
  1. TRUE / FALSE の自動変換
    ほとんどのプログラミング言語の MariaDB/MySQL ドライバーは、言語の true/false を MariaDB の 1/0 に自動的に変換してくれます。また、MariaDB から 1/0 が返された際に、自動的に言語のブール型に変換してくれるドライバーもあります。

  2. 明示的な型変換の重要性
    ドライバーによっては TINYINT(1) を数値として返すことがあるため、特に PHP の例のように、アプリケーション側で (bool) などの明示的な型キャストを行う習慣をつけることをお勧めします。これにより、予期せぬ動作を防ぎ、コードの可読性を高めます。

  3. SQL クエリ内での BOOLEAN
    SQL クエリ内では、is_active = TRUE と書くのが最も意図が明確で良い方法です。これは is_active = 1 と同等に扱われます。同様に、is_active = FALSEis_active = 0 と同等です。

  4. NULL 値の扱い
    BOOLEAN カラムが NULL を許可している場合、NULLTRUE でも FALSE でもない「不明」な状態であることを覚えておいてください。WHERE is_active = TRUEWHERE is_active = FALSENULL を返しません。NULL も考慮する場合は WHERE is_active IS TRUEWHERE is_active IS FALSEWHERE is_active IS NULL を適切に使い分ける必要があります。ただし、通常は BOOLEAN NOT NULL DEFAULT FALSE と定義し、NULL を避けるのが良いプラクティスです。



TINYINT(1) を直接使用する

メリット

  • 互換性
    BOOLEAN が MariaDB/MySQL 固有のエイリアスであることを意識する必要がなくなります(他のデータベースシステムでは BOOLEAN が全く異なる振る舞いをすることもあるため)。
  • 明確性
    データベーススキーマを見たときに、これが1バイトの整数であり、慣習的に真偽値を表すものであることがより明確になる可能性があります。

デメリット

  • コードの意図
    is_active BOOLEAN と書く方が、「これは論理的な真偽値を表す」という意図がストレートに伝わります。
  • 可読性 (SQL)
    CREATE TABLE 文や ALTER TABLE 文で BOOLEAN と書くよりも、意味合いが直感的に伝わりにくいと感じる人もいるかもしれません。

コード例

-- テーブル定義
CREATE TABLE products (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(255) NOT NULL,
    is_available TINYINT(1) NOT NULL DEFAULT 1 -- 1:利用可能, 0:利用不可
);

-- データ挿入
INSERT INTO products (name, is_available) VALUES ('Laptop', 1);
INSERT INTO products (name, is_available) VALUES ('Mouse', 0);

-- データ取得 (アプリケーション側では 1/0 を true/false に変換)
SELECT name, is_available FROM products WHERE is_available = 1;

プログラミングにおける考慮事項
BOOLEAN を使用した場合と全く同じです。1TRUE0FALSE として扱い、アプリケーション側で必要に応じて型変換を行います。

ENUM('true', 'false') を使用する

メリット

  • 可読性 (データ)
    データベースツールで直接データを参照したときに、10 よりも 'true''false' の方が直感的で分かりやすいと感じる場合があります。
  • 厳密な値の制限
    カラムに 'true' または 'false' 以外の値が入ることをデータベースレベルで完全に防げます(TINYINT(1) の場合は 0 以外の数値も格納可能)。

デメリット

  • 非標準
    ENUM 型は SQL 標準ではありません(ただし MariaDB/MySQL では広く使われています)。
  • SQL クエリ
    WHERE status = 'true' のように文字列比較を行う必要があります。
  • プログラミングの複雑さ
    アプリケーションコードで true/false ブール値と 'true'/'false' 文字列の間で変換が必要になります。
  • パフォーマンス
    整数型に比べてわずかながらストレージ使用量が増え、インデックスの効率が落ちる可能性があります(ただし、多くの場合は無視できる差です)。

コード例

-- テーブル定義
CREATE TABLE tasks (
    id INT PRIMARY KEY AUTO_INCREMENT,
    description VARCHAR(255) NOT NULL,
    is_completed ENUM('true', 'false') NOT NULL DEFAULT 'false'
);

-- データ挿入
INSERT INTO tasks (description, is_completed) VALUES ('Buy groceries', 'false');
INSERT INTO tasks (description, is_completed) VALUES ('Finish report', 'true');

-- データ取得
SELECT description, is_completed FROM tasks WHERE is_completed = 'true';

プログラミングにおける考慮事項

  • 取得時
    データベースから取得した 'true' または 'false' の文字列を、アプリケーションのブール値に変換します。
  • 挿入時
    アプリケーションのブール値を 'true' または 'false' の文字列に変換して挿入します。

PHP 例

// 挿入時
$isCompleted = true;
$dbValue = $isCompleted ? 'true' : 'false';
$stmt->bind_param("ss", $description, $dbValue);

// 取得時
$isCompleted = ($row['is_completed'] === 'true');

BIT(1) を使用する

メリット

  • 厳密な値
    0 または 1 以外の値は格納できません。
  • ストレージ効率
    最もストレージ効率が良い(1ビット)です。

デメリット

  • 可読性
    SELECT 結果で BIT 型の値がどのように表示されるか、データベースツールによって異なります。
  • ドライバの扱い
    各プログラミング言語のデータベースドライバが BIT 型をどのように扱うかによって、挙動が大きく異なることがあります。一部のドライバは BIT(1) を数値 (0 または 1) として返したり、バイナリデータとして返したり、直接ブール値として返したりします。

コード例

-- テーブル定義
CREATE TABLE settings (
    id INT PRIMARY KEY AUTO_INCREMENT,
    setting_name VARCHAR(255) NOT NULL,
    is_enabled BIT(1) NOT NULL DEFAULT b'1' -- b'1' はバイナリ 1 を意味する
);

-- データ挿入
INSERT INTO settings (setting_name, is_enabled) VALUES ('Notifications', b'1');
INSERT INTO settings (setting_name, is_enabled) VALUES ('Dark Mode', b'0');

-- データ取得 (BIT 型の扱い方に注意)
SELECT setting_name, is_enabled FROM settings WHERE is_enabled = b'1';

プログラミングにおける考慮事項
BIT(1) は、ドライバーによって扱いが最も異なる可能性のある型です。

  • Node.js (mysql2)
    Buffer オブジェクトとして返されることがあります。
    isEnabled = (row.is_enabled && row.is_enabled[0] === 1);
    
  • Python (mysql-connector-python)
    bytearraybytes オブジェクトとして返されることがあります。
    isEnabled = (row['is_enabled'] == b'\x01')
    
  • PHP (mysqli)
    BIT(1) は ASCII 0 または ASCII 1 の文字列として返されることが多いです。
    $isEnabled = ($row['is_enabled'] === "\x01"); // "\x01" は ASCII 1 (SOH)
    

BIT(1) の利用は、使用する言語とデータベースドライバの組み合わせについて十分なテストと理解が必要です。

ほとんどの場合、MariaDB で BOOLEAN (または TINYINT(1)) を使用するのが最もシンプルで一般的で推奨される方法です。これは、SQL の可読性と、多くのデータベースドライバーでの自動的なブール値変換の点で優れています。

代替方法を検討する主な理由は以下の通りです。

  • 極端なストレージ効率の追求
    非常に大規模なデータセットで、わずかなストレージの節約が重要な場合、BIT(1) が検討されることもあります。しかし、これはプログラミングの複雑さを伴うことが多いです。
  • 他のデータベースシステムとの互換性
    複数のデータベースシステムを使用している場合、それぞれのブール値の扱いの違いを理解し、最も互換性の高い方法(例えば、特定の ORM が BIT(1) を好むなど)を選択することがあります。
  • 厳密な値の制限が必要な場合
    ENUM('true', 'false') は、'true' または 'false' 以外の値がカラムに格納されることを完全に防ぎます。