結論

boolean(ブーリアン)とは、真(true)か偽(false)の2つの値だけをとるデータ型です。日本語では真偽値・ブール型・論理型と呼びます。どの言語にもありますが、「どの値を真とみなすか」は言語ごとに違い、そこでつまずきます。

この記事でわかること

  • プログラミング・SQL・検索・数学での boolean の意味の違い
  • Python・JavaScript・Java・C など8言語で「真とみなされる値」を実行した結果
  • YAML の yes/no、"false" が真になる問題などのエラー原文と直し方

2026年10月29日更新|Python 3.13・Node.js 22・Java 21・PostgreSQL 16・PyYAML 6.0 で実行確認

boolean は、条件分岐(if 文)やフラグ(オン・オフの印)に使う、いちばん小さなデータ型です。比較の結果(5 > 3)は boolean になり、if 文はその結果を見て進む道を決めます。ややこしいのは、boolean 以外の値(0・空文字・"false" という文字列など)を条件に置いたときの扱いです。

flowchart TD
    A[値や式を if の条件に置く] --> B{比較の結果か}
    B -->|はい| C[true / false]
    B -->|いいえ| D{言語の決まり}
    D -->|Java・Go・Rust| E[コンパイルエラー]
    D -->|Python・JS など| F[falsy は偽<br>それ以外は真]

よく調べられることの答えを先にまとめます。

知りたいこと 答え 詳しい節
booleanとは 真(true)と偽(false)の2値だけをとる型 booleanとは(場面別の意味)
ブール型・真偽値・論理型の違い どれも同じものを指す呼び方 booleanとは(場面別の意味)
true false の判定(偽になる値) Python は 0・空・None、JavaScript は 0・""・null・undefined・NaN など 真とみなされる値(truthy・falsy)
"false" という文字列は偽? Python・JavaScript・PHP では真になる 文字列をbooleanに変換する
論理演算(AND・OR・NOT) 真理値表のとおり。and/or は短絡評価される ブール演算と真理値表
SQL の boolean 型 PostgreSQL は boolean、MySQL は TINYINT(1)、SQLite は整数 SQLのboolean型
YAML の yes/no 読み込むライブラリによって true にも文字列にもなる JSONとYAMLの真偽値
検索のブール演算 AND・OR・NOT で条件を組み合わせる検索方法 検索のブール演算

確認環境:Ubuntu 24.04.5 LTS の上で、Python 3.13.18、Node.js 22.23.4、OpenJDK 21.0.12.1(javac・java)、gcc 13.3.0(C17 と C2x)、Go 1.24.7、rustc 1.97.0、PHP 8.3.6、Ruby 3.3.6、GNU bash 5.2.21 を使い、同じ値を条件に置いたときの結果とエラーの原文を確かめました。SQL は PostgreSQL 16.15 を作業用のデータディレクトリで起動し(TCP では待ち受けず、Unix ソケットだけで接続)、SQLite 3.53.1 は Python の sqlite3 モジュールから使っています。MySQL は手元に無いため、MySQL 8.4 リファレンスマニュアルの記述で確かめました。YAML は PyYAML 6.0.3・ruamel.yaml 0.19.1(作業用の venv)、js-yaml 4.3.2・yaml 2.9.1(作業用の npm)、Ruby の Psych 5.1.2 で同じファイルを読み込んで比べています。Google 検索の演算子は Google 検索ヘルプ、言語の決まりは Python・MDN・PostgreSQL・YAML の公式ドキュメントで確かめました。図は mermaid 11.16.0 で描画を確かめています(確認日 2026年10月29日)。

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「booleanとは?真偽値・ブール型の意味と「真とみなされる値」を8言語で比較」

booleanとは(場面別の意味の表)

この節では、boolean という言葉がプログラミング・データベース・検索・数学でそれぞれ何を指すのかが分かります。

boolean は「真か偽か」の2つだけを扱う考え方で、名前は19世紀の数学者ジョージ・ブール(George Boole)に由来します。 読み方は「ブーリアン」です。日本語の「真偽値」「ブール型」「ブーリアン型」「論理型」は、どれも同じものを指します。言語によって型の名前が bool・boolean・Boolean と分かれますが、中身は同じです。

同じ「boolean」でも、使われる場面によって指すものが少しずつ違います。検索で調べたときに話がかみ合わないのは、たいていこの違いです。

場面 boolean が指すもの 書き方の例 注意点
プログラミング true・false の2値をとるデータ型 True(Python)、true(JS・Java) 大文字小文字が言語で違う
条件分岐 if・while が見る「真か偽か」の判定 if (count > 0) boolean 以外を置いたときの扱いが違う
データベース(SQL) 真・偽・不明(NULL)の3状態をとる列の型 active boolean NULL があるので3値になる
設定ファイル(JSON・YAML) true・false と書いた値 "debug": false YAML の yes/no は読み手次第
検索(ブール検索) AND・OR・NOT で条件を組み合わせる検索 python AND boolean 使える演算子は検索サービスごとに違う
数学・論理回路 ブール代数(0 と 1、論理積・論理和・否定) A・B、A+B、¬A 1+1=1 になる(論理和)

booleanになるもの・ならないもの

プログラムの中で boolean が生まれるのは、主に次の3つです。

1

比較の結果

5 > 3・a == b・x in list の結果は boolean。

いちばん多い

2

リテラル

コードに直接 true・false と書いた値。フラグの初期値など。

言語で綴りが違う

3

判定する関数

isEmpty()・startswith()・Array.isArray() など。

is・has で始まる名前

4

変換

bool(x)・Boolean(x)・!!x で他の値を変える。

言語の決まりで変わる

C 言語で printf("%d\n", 5 > 3); を実行すると 1 と表示されました。C の比較の結果は int の 1 か 0 で、boolean と整数の境目が言語によって違うことが、この記事の大きなテーマです。

ブール演算と真理値表(AND・OR・NOT・XOR)

この節では、boolean 同士を組み合わせる論理演算と、その結果を一覧にした真理値表が分かります。

論理演算は、AND(かつ)・OR(または)・NOT(ではない)の3つが基本です。 AND は両方が真のときだけ真、OR はどちらかが真なら真、NOT は真と偽をひっくり返します。Python で4通りの組み合わせをすべて計算させると、次のようになりました。

from itertools import product
print('A     B     | A and B  A or B  not A  A xor B')
for A, B in product([False, True], repeat=2):
    print(f'{A!s:5} {B!s:5} | {A and B!s:8} {A or B!s:7} {not A!s:6} {A ^ B!s}')
A     B     | A and B  A or B  not A  A xor B
False False | False    False   True   False
False True  | False    True    True   True
True  False | False    True    False  True
True  True  | True     True    False  False
De Morgan holds for all 4 rows: True

最後の行は、ド・モルガンの法則(not (A and B) は (not A) or (not B) と同じ、not (A or B) は (not A) and (not B) と同じ)を4通りすべてで確かめた結果です。条件を読みやすく書き直すときに使います。

言語ごとの演算子の書き方

演算 Python JavaScript・Java・C SQL 数学・回路
論理積(AND) and && AND A・B、A∧B
論理和(OR) or || OR A+B、A∨B
否定(NOT) not ! NOT ¬A、A の上に線
排他的論理和(XOR) ^・!= ^・!= <>(boolean 同士) A⊕B

XOR(どちらか片方だけが真のとき真)の使い道や、ビット演算としての XOR は、別記事「XORとは?排他的論理和の真理値表と使い道|8言語とSQLで実行」で扱います。

not の優先順位

Python の公式ドキュメントは、not はブール演算以外の演算子より優先度が低いので、not a == b は not (a == b) と解釈され、a == not b は構文エラーになると説明しています。迷ったら括弧を付けるのが確実です。

真とみなされる値(truthy・falsy)を8言語で比較

この節では、boolean 以外の値を if の条件に置いたとき、言語ごとに真になるか偽になるかが一覧で分かります。

多くの言語は、boolean 以外の値も条件に置けて、決まった値だけを偽として扱います。 偽として扱われる値を falsy(フォールシー)、真として扱われる値を truthy(トゥルーシー)と呼びます。Java・Go・Rust は逆に、boolean 以外を条件に置くとコンパイルエラーにします。同じ値を各言語で条件に置き、結果を並べました(「エラー」はコンパイルエラー)。

値 Python JavaScript PHP Ruby
0 偽 偽 偽 真
0.0 偽 偽 偽 真
空文字 "" 偽 偽 偽 真
文字列 "0" 真 真 偽 真
文字列 "false" 真 真 真 真
空の配列 [] 偽 真 偽 真
空のオブジェクト・辞書 {} 偽 真 ― 真
null・None・nil 偽 偽 偽 偽
NaN 真 偽 ― ―

C は「0(0.0・NULL ポインターを含む)だけが偽、それ以外は真」でした。Java・Go・Rust は、if (1) のように整数を置いた時点でコンパイルが止まります。

言語 整数を if に置くと 偽になる主な値
C 動く(0 なら偽) 0・0.0・NULL
Java コンパイルエラー false だけ
Go コンパイルエラー false だけ
Rust コンパイルエラー false だけ

1"false" はどこでも真

中身があれば真という決まりのため、試した動的言語4つすべてで文字列 "false" は真になった。

2空の配列は言語で逆

Python・PHP は偽、JavaScript・Ruby は真。「配列が空なら」を if (arr) で書くと JavaScript では動かない。

3Ruby は 0 も真

Ruby で偽になるのは false と nil だけ。0・空文字・空の配列はすべて真だった。

PHP の文字列は、"0" は偽ですが "0.0" と "00" は真でした。手元で (bool) に変換した結果です。

0          -> false
'0'        -> false
'0.0'      -> true
''         -> false
' '        -> true
'false'    -> true
NULL       -> false
0.0        -> false
'00'       -> true

Pythonのbool(True・False と int の関係)

この節では、Python の bool の書き方、偽になる値の一覧、bool が int の一種であることから起きる意外な動きが分かります。

Python の真偽値は True と False(先頭が大文字)で、型は bool です。 Python の公式ドキュメントは、偽とみなされる主な組み込みオブジェクトとして「None と False」「数値のゼロ(0・0.0・0j・Decimal(0)・Fraction(0, 1))」「空のシーケンスやコレクション(''・()・[]・{}・set()・range(0))」を挙げています。手元で bool() に通した結果です。

vals = [False, True, 0, 1, -1, 0.0, float('nan'), '', ' ', '0', 'False', 'false',
        [], [0], {}, (), None, set(), b'']
for v in vals:
    print(f"{v!r:>14} -> {bool(v)}")
         False -> False
          True -> True
             0 -> False
             1 -> True
            -1 -> True
           0.0 -> False
           nan -> True
            '' -> False
           ' ' -> True
           '0' -> True
       'False' -> True
       'false' -> True
            [] -> False
           [0] -> True
            {} -> False
            () -> False
          None -> False
         set() -> False
           b'' -> False

空白1文字(' ')、[0](0 が1つ入ったリスト)、NaN は真です。「中身があるか」で決まり、中身の値は見ていません。

bool は int のサブクラス

公式ドキュメントには「bool は int のサブクラスです」とあり、False と True は多くの場面で 0 と 1 のように振る舞います。手元で確かめると、次のとおりでした。

print(type(True), isinstance(True, int), True + True, True * 10, sum([True, False, True]))
d = {1: 'int', True: 'bool'}; print(d)
print(0 or 10, '' or 'default', [] and 'x', 3 and 5, None or [] or 0)
<class 'bool'> True 2 10 2
{1: 'bool'}
10 default [] 5 0
  • sum([True, False, True]) は 2:条件に合う件数を数えるときに使われる書き方です。
  • 辞書のキー 1 と True は同じキー:{1: 'int', True: 'bool'} はキーが1つにまとまり、値が後から書いた 'bool' で上書きされました。
  • and・or は True・False ではなく、どちらかの値を返す:0 or 10 は 10、3 and 5 は 5 です。既定値を入れる name or '名無し' の書き方はこの性質を使っています。

公式ドキュメントは、この 0・1 としての振る舞いを当てにせず、整数が欲しいときは int() で明示的に変換するよう勧めています。

True と書くべきところで true と書いたとき

>>> x = true
NameError: name 'true' is not defined. Did you mean: 'True'?

>>> True = 1
SyntaxError: cannot assign to True

>>> if x = True: pass
SyntaxError: invalid syntax. Maybe you meant '==' or ':=' instead of '='?

JavaScript・JSON の書き方(小文字の true)を Python に持ち込むと NameError になります。Python 3.13 はエラー文の最後で正しい綴りを提案してくれました。

if 文での and・or・not の書き方そのものは、関連記事「Python if文の書き方|elif・elseとand・or・notの条件式」で扱っています。

JavaScriptのboolean(Boolean()・!!・== の比較)

この節では、JavaScript の falsy な値の一覧と、Boolean()・!!・new Boolean()・== の違いが分かります。

JavaScript で偽になる値は、false・0・-0・0n・""・null・undefined・NaN の8つで、それ以外はすべて真です。 MDN の Boolean のページにも同じ一覧が載っています。Node.js 22 で確かめた結果です。

     false -> false
      true -> true
         0 -> false
        -0 -> false
         1 -> true
       NaN -> false
        "" -> false
       " " -> true
       "0" -> true
   "false" -> true
        [] -> true
       [0] -> true
        {} -> true
      null -> false
 undefined -> false
        0n -> false
        1n -> true
  Infinity -> true

Boolean() と !! と new Boolean()

console.log('Boolean("false") =', Boolean('false'), ' !!"false" =', !!'false');
console.log('new Boolean(false) is', typeof new Boolean(false), '-> if:', (new Boolean(false)) ? 'truthy' : 'falsy');
Boolean("false") = true  !!"false" = true
new Boolean(false) is object -> if: truthy

boolean に変換するとき

やってはいけないnew Boolean(false)。中身が false でも型は object になり、if では真として扱われた
→
代わりにBoolean(x) か !!x。new を付けずに呼ぶと、プリミティブの true・false が返る

MDN も Boolean() コンストラクターを new と一緒に使わないよう書いている

== false と falsy は別物

「falsy であること」と「== false が真になること」は一致しません。 == は比べる前に型を変換するためです。

[] == false: true  "0" == false: true  null == false: false  NaN == false: false
[] === false: false

空の配列 [] は truthy なのに [] == false は true、null は falsy なのに null == false は false でした。MDN は if (condition === true) ではなく if (condition) と書くことを勧めています。真偽を確かめたいだけなら条件にそのまま置き、値を比べたいなら === を使います。

|| と ?? の違い

0 || 10 = 10  0 ?? 10 = 0  '' || 'x' = x  null ?? 'x' = x
'a' && 'b' = b  0 && 'b' = 0

|| は左が falsy なら右を返すので、0 や空文字も「値が無い」とみなされて既定値に置き換わります。??(Null 合体演算子)は null と undefined のときだけ右を返します。件数 0 や空文字を正しい値として残したいときは ?? を使います。

typeof で型を確かめる方法は、関連記事「JavaScript型判定 typeof・instanceof・null早見表」で扱っています。

JavaとCのboolean(整数と混ぜられるか・Go・Rust)

この節では、型に厳しい Java・Go・Rust と、整数で真偽を表す C の違いが、コンパイルエラーの原文で分かります。

Java は boolean と整数を混ぜられない

Java の boolean はプリミティブ型で、値は true と false だけです。整数を条件に置くとコンパイルエラーになります。

public class E { public static void main(String[] a) { int i = 1; if (i) { } boolean b = 1; } }
E.java:1: error: incompatible types: int cannot be converted to boolean
2 errors

Go と Rust も同じ考え方でした。

./main.go:2:26: non-boolean condition in if statement

error[E0308]: mismatched types
 --> r.rs:1:27
  |
1 | fn main() { let x = 1; if x { println!("x"); } }
  |                           ^ expected `bool`, found integer

Java には、プリミティブの boolean のほかに、オブジェクトの Boolean(ラッパークラス)があります。Boolean は null を入れられるため、if に置くと実行時に例外になります。

Boolean flag = null;
if (flag) System.out.println("never");
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "java.lang.Boolean.booleanValue()" because "flag" is null
	at B.main(B.java:13)

if (flag) の裏で flag.booleanValue() が呼ばれていることが、エラー文から分かります(-g を付けずにコンパイルすると、変数名の代わりに "<local3>" と表示されました)。Java の演算子の優先順位は、関連記事「Java演算子一覧と優先順位表|三項演算子・インクリメントの注意点」で扱っています。

C は 0 が偽、0 以外が真

C は長いあいだ boolean 型を持たず、int の 0 を偽、0 以外を真として使ってきました。 C99 で _Bool 型と <stdbool.h>(bool・true・false を使えるようにするヘッダー)が入りました。gcc 13 の C17 で動かした結果です。

#include <stdio.h>
#include <stdbool.h>
#include <string.h>
int main(void) {
    bool b = 2;          /* 0以外を入れると 1 になる */
    int flag = 2;        /* int で代用した真偽値 */
    printf("sizeof(bool)=%zu  b=%d  true=%d false=%d\n", sizeof(bool), b, true, false);
    printf("flag=2: if(flag) -> %s, flag == true -> %s\n", flag ? "真" : "偽", flag == true ? "真" : "偽");
    printf("strcmp(\"a\",\"a\")=%d -> if(strcmp(...)) は %s\n", strcmp("a","a"), strcmp("a","a") ? "真" : "偽");
    return 0;
}
sizeof(bool)=1  b=1  true=1 false=0
flag=2: if(flag) -> 真, flag == true -> 偽
strcmp("a","a")=0 -> if(strcmp(...)) は 偽
  • flag == true は偽になった:true は 1 なので、2 とは等しくありません。int で真偽を持つときは if (flag) と書き、== true と比べないのが決まりごとです。
  • strcmp は一致すると 0(偽)を返す:「同じなら真」と思って if (strcmp(a, b)) と書くと、逆の動きになります。
  • bool 型に 2 を入れると 1 になる:_Bool は 0 以外を代入すると 1 に変わります。

<stdbool.h> を書かずに C17 で bool を使うと error: unknown type name 'bool' と error: 'true' undeclared が出ました。-std=c2x(C23)では bool・true・false がキーワードになり、ヘッダー無しでコンパイルが通りました。-Wall -Wextra を付けると、if (x = 0) には suggest parentheses around assignment used as truth value、bool と 2 の比較には comparison of constant '2' with boolean expression is always false という警告が出ます。

booleanのメモリサイズ(1ビットではない)

1バイトC の sizeof(bool)bool[1000] は 1000 バイト
8MBPython の [True]*100万要素1つにつき参照8バイト
133KB同じ100万個をビットで持つPython の int を使った場合

boolean の情報量は1ビットですが、メモリでは1バイト以上を使うのがふつうです。C は1バイト、PostgreSQL の boolean 列も公式ドキュメントで1バイトとされています。Python のリストは要素ごとに参照(8バイト)を持つため、100万個の True で約8MB、bytearray なら約1MB、整数のビットで持つと約133KB でした。大量のフラグを持つときは、ビット列やビット演算を使う方法があります。

短絡評価(&& と & の違い)

この節では、論理演算の右側が実行されない「短絡評価」と、それを使った書き方・しない演算子との違いが分かります。

短絡評価(ショートサーキット評価)とは、左側だけで結果が決まったときに右側を実行しないことです。 AND は左が偽なら全体が偽、OR は左が真なら全体が真なので、右を見る理由がありません。呼ばれたら表示する関数で確かめました。

def a(): print('  a() called'); return False
def b(): print('  b() called'); return True
print('a() and b():'); r = a() and b(); print('  ->', r)
print('b() or a():');  r = b() or a();  print('  ->', r)
print('a() & b():');   r = a() & b();   print('  ->', r)
a() and b():
  a() called
  -> False
b() or a():
  b() called
  -> True
a() & b():
  a() called
  b() called
  -> False

Java(&& と &)と JavaScript でも同じで、&& では b() が呼ばれず、& では両方が呼ばれました。JavaScript の a() & b() は、ビット演算なので結果が false ではなく数値の 0 になりました。

書き方 右側の実行 結果の型 使いどころ
&&・and 左が偽なら実行しない Java は boolean、Python・JS は左右どちらかの値 null チェックの後に中身を見る
||・or 左が真なら実行しない 同上 既定値・キャッシュがあれば使う
&・|(Java の boolean) 必ず実行する boolean 両方の副作用が要るとき(まれ)
&・|(JS・C・Python の整数) 必ず実行する 整数(ビット演算) フラグのビットを操作する

短絡評価で null を避ける

短絡評価は、null(None)のときに中身を見に行かないために使います。user is not None and user.name は、user が None のときに右側を実行しないので、AttributeError になりません。手元では False が返りました。JavaScript なら user?.name(オプショナルチェーン)も使え、user が null のとき undefined が返りました。

  • 1null チェックを左に置くobj != null && obj.isValid() の順なら、null のときに右側が実行されない
  • 2右側に必ず行う処理を置かないログ出力や保存を右に書くと、左の結果しだいで飛ばされる
  • 3軽い判定を左に置く重い処理(DB 問い合わせなど)を右に置くと、不要なときに実行されない
  • 4& と && を取り違えない& は短絡しない。JavaScript・C では数値の結果になる

SQLのboolean型(PostgreSQL・MySQL・SQLite と NULL)

この節では、データベースごとの boolean 型の違いと、NULL があるために「真・偽・不明」の3つになる扱いが分かります。

SQL の boolean は、真・偽に加えて NULL(不明)を持てる3値です。 PostgreSQL の公式ドキュメントは、boolean 型は 'true'・'false' と、SQL の NULL で表す第3の状態 'unknown' を持てる、と説明しています。データベースごとの違いを先にまとめます。

データベース boolean の実体 TRUE を表示すると 確かめ方
PostgreSQL 16 独立した boolean 型(1バイト) t 手元で実行
MySQL 8.4 BOOLEAN は TINYINT(1) の別名 1 公式マニュアル
SQLite 3.53 boolean 型は無く、整数 1・0 1 手元で実行

PostgreSQL で受け付ける値

SELECT 't'::boolean AS t, 'yes'::boolean AS yes, 'on'::boolean AS on_,
       '1'::boolean AS one, 'f'::boolean AS f, 'OFF'::boolean AS off_;
SELECT 'maybe'::boolean;
 t | yes | on_ | one | f | off_
---+-----+-----+-----+---+------
 t | t   | t   | t   | f | f
(1 row)

psql:b.sql:5: ERROR:  invalid input syntax for type boolean: "maybe"
LINE 1: SELECT 'maybe'::boolean;
               ^

公式ドキュメントのとおり、true・yes・on・1(偽は false・no・off・0)と、その一意な接頭辞(t・n など)を、大文字小文字を区別せずに受け付けました。「はい」を入れようとすると invalid input syntax for type boolean: "はい" になりました。

NULL があると WHERE の結果が変わる

active が true・false・NULL の3人の表で確かめました。

SELECT name FROM users WHERE active = NULL;     -- 0 rows
SELECT name FROM users WHERE NOT active;        -- 鈴木
SELECT name FROM users WHERE active IS NOT TRUE; -- 鈴木, 高橋
SELECT NULL AND false, NULL AND true, NULL OR true, NOT NULL::boolean;
 NULL AND false | NULL AND true | NULL OR true | NOT NULL
----------------+---------------+--------------+----------
 f              | (null)        | t            | (null)
  • WHERE NOT active は NULL の行を返さない:NOT NULL は NULL(不明)のままで、WHERE は真の行だけを返すためです。
  • 「true ではない行」を全部欲しいときは IS NOT TRUE:false と NULL の両方が返りました。
  • = NULL は何も返さない:NULL との比較は NULL になります。IS NULL を使います。
  • NULL AND false は false:片方が偽なら、もう片方が不明でも結果は偽と決まります。

集計では、sum(active::int) で true の件数(1)、bool_and(active) で全部真か(f)、bool_or(active) でどれか真か(t)を求められました。NULL と3値論理の落とし穴は、関連記事「SQLのNULLの落とし穴8選|NOT IN・三値論理」で扱っています。

MySQL と SQLite は整数

MySQL 8.4 のマニュアルは、BOOL・BOOLEAN は TINYINT(1) の同義語で、0 は偽、0 以外は真とみなされると書いています。さらに、TRUE と FALSE は 1 と 0 の別名にすぎないため、2 = TRUE は偽になる例を載せています。C の flag == true と同じ落とし穴です。

SQLite では、BOOLEAN と宣言した列に True・False・'yes'・2 を入れると、次のように保存されました。

('a', 1, 'integer')
('b', 0, 'integer')
('c', 'yes', 'text')
('d', 2, 'integer')
(1, 0, 'integer', 1)          -- SELECT TRUE, FALSE, typeof(TRUE), 5 > 3
[('a',), ('d',)]              -- WHERE active

'yes' は文字列のまま入り、WHERE active では偽として扱われました(2 は真)。SQLite の列の型は「好み」の指定なので、入る値を絞りたいときは CHECK (active IN (0, 1)) の制約を付けます。

JSONとYAMLの真偽値(yes/no の落とし穴)

この節では、設定ファイルやデータの受け渡しで true・false をどう書くかと、YAML の yes/no が読み込むライブラリで変わる問題が分かります。

JSON は小文字の true・false だけ

JSON の真偽値は小文字の true と false だけで、True・TRUE・'yes' は書けません。 書くと読み込みでエラーになりました。

>>> json.loads("True")              (Python)
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

> JSON.parse("True")                (Node.js)
SyntaxError: Unexpected token 'T', "True" is not valid JSON

Python の json.dumps({'a': True, 'b': None}) は {"a": true, "b": null} を出し、json.loads('{"x": false}') は {'x': False} を返しました。変換はライブラリに任せ、文字列を手で組み立てないのが確実です。

YAML の yes・no・on・off は読み手しだい

YAML 1.1 の boolean の定義は、y|Y|yes|Yes|YES|n|N|no|No|NO|true|True|TRUE|false|False|FALSE|on|On|ON|off|Off|OFF を真偽値として扱います。YAML 1.2 では、問題の多かった暗黙の型付けの推奨が取り除かれ、真偽値は true・false(と大文字の変化形)に絞られました。同じファイルでも、YAML 1.1 で読むか 1.2 で読むかで結果が変わります。 次のファイルを5つのライブラリで読みました。

a: true
d: yes
e: no
f: on
h: y
j: NO
k: "no"
値 PyYAML 6.0.3 Ruby Psych 5.1.2 ruamel.yaml 0.19.1 js-yaml 4.3.2
true True true True true
yes True true 'yes' "yes"
no False false 'no' "no"
on True true 'on' "on"
y 'y' "y" 'y' "y"
NO False false 'NO' "NO"
"no"(引用符つき) 'no' "no" 'no' "no"

Node.js の yaml 2.9.1 は既定では js-yaml と同じ結果で、{ version: '1.1' } を指定すると y・n まで true・false になりました。PyYAML と Psych は YAML 1.1 の定義に載っている y・n を文字列のまま残しており、仕様の表と実装も完全には一致しません。

yes・no が真偽値になった

PyYAML 6.0.3(safe_load)

Ruby の Psych 5.1.2

yaml 2.9.1(version: '1.1' を指定)

yes・no が文字列のまま

ruamel.yaml 0.19.1(YAML 1.2)

js-yaml 4.3.2・yaml 2.9.1(既定)

yq 3.1.0(Ubuntu の apt 版)

国コードの NO と GitHub Actions の on

PyYAML で国コードの一覧を読むと、ノルウェーの NO が False に変わりました。また、GitHub Actions のワークフローの on: キーを PyYAML で読むと、キーそのものが True になりました。

>>> yaml.safe_load('countries: [GB, IE, NO, SE]')
{'countries': ['GB', 'IE', False, 'SE']}

>>> yaml.safe_load('on:\n  push:\n    branches: [main]')
{True: {'push': {'branches': ['main']}}}

文字列として扱いたい値は "no" のように引用符で囲むと、どのライブラリでも文字列になりました。YAML の書き方全体と他の落とし穴は、関連記事「YAMLの書き方|構文一覧とパース結果、落とし穴10例を実測」で扱っています。

文字列の"true"・"false"をbooleanに変換する方法

この節では、フォームの値・環境変数・CSV などで文字列として届いた "true"・"false" を、正しく boolean に変える方法が分かります。

bool("false") は True になります。文字列を boolean に変えるときは、型変換ではなく「どの文字列を真とするか」を自分で決めて比べます。 環境変数 DEBUG=false を bool(os.environ['DEBUG']) で読むと、デバッグが有効になってしまいます。

1

前後の空白を取り、小文字にそろえる

" TRUE " や "Yes" を同じに扱うため、strip と lower を最初に通す。

全言語

2

真の文字列・偽の文字列を一覧で決める

true・1・yes・on を真、false・0・no・off を偽、のように両方を決める。片方だけ決めると、打ち間違いが黙って偽になる。

設計

3

どちらにも当たらなければエラーにする

"maybe" や "ture" は例外を出して止める。既定値で黙って進めない。

入力チェック

TRUE = {'1', 'true', 'yes', 'on', 'y', 't'}
FALSE = {'0', 'false', 'no', 'off', 'n', 'f', ''}
def to_bool(s: str) -> bool:
    v = s.strip().lower()
    if v in TRUE: return True
    if v in FALSE: return False
    raise ValueError(f'真偽値として読めません: {s!r}')
'True' -> True
'false' -> False
'YES' -> True
'0' -> False
'off' -> False
'maybe' -> ValueError: 真偽値として読めません: 'maybe'
bool("false") = True

以前は distutils.util.strtobool がこの用途で使われていましたが、distutils は Python 3.12 で標準ライブラリから外されました。Python 3.13 の素の venv で読み込むと ModuleNotFoundError: No module named 'distutils' になります(setuptools が入った環境では、setuptools の持つ互換の distutils が読み込まれて動いてしまうことがあり、手元でもそうなりました)。

言語ごとの変換関数

言語 書き方 手元の結果
Java Boolean.parseBoolean(s) "TRUE" は true、"yes"・"1"・null は false(エラーにならない)
PHP filter_var($s, FILTER_VALIDATE_BOOLEAN) "yes" は true、"off" は false。FILTER_NULL_ON_FAILURE で "maybe" は NULL
JavaScript s.trim().toLowerCase() === 'true' 組み込みの変換関数は無い。JSON.parse は "True" で SyntaxError
Python 自作の to_bool(上の例) bool(s) は空文字以外すべて True
PostgreSQL 'yes'::boolean 決まった綴り以外はエラー

Java の parseBoolean は「"true"(大文字小文字は問わない)なら true、それ以外はすべて false」で、打ち間違いを検出しません。厳密に読みたいときは、上の手順2・3のように自分で比べます。PHP で値が空かどうかを判定する関数の違いは、関連記事「PHP isset・empty・is_nullの違い|null判定の早見表」で扱っています。

検索のブール演算(AND・OR・NOT)

この節では、データ型ではなく検索の方法としての「ブール検索」と、検索サービスによって使える演算子が違うことが分かります。

ブール検索とは、キーワードを AND(両方含む)・OR(どちらか含む)・NOT(含まない)で組み合わせる検索方法です。 図書館の蔵書検索・論文データベース・社内文書の全文検索などで使われます。手元の SQLite の全文検索(FTS5)に4つの文書を入れて確かめました。

'python AND boolean'     ['python boolean 入門']
'python OR java'         ['python boolean 入門', 'java boolean 型', 'python yaml 設定']
'boolean NOT java'       ['python boolean 入門']
'"boolean 入門"'          ['python boolean 入門']
'python and boolean'     []

最後の行が要点です。FTS5 では演算子は大文字で書く決まりで、小文字の and は「and という単語」として検索され、0件になりました。 演算子の書き方は検索サービスごとに決まっているので、使う前にそのサービスのヘルプを確かめます。

やりたいこと ブール検索 Google 検索ヘルプにある書き方
両方を含む A AND B スペースで区切って並べる
語を除く A NOT B A -B(語の前に半角のマイナス)
完全一致 "A B" "A B"(引用符で囲む)
サイトを絞る ― site:example.com A

Google 検索ヘルプの「Google 検索の絞り込み」には、完全一致の引用符・site:・除外の -・before:・after:・filetype: が載っており、2026年10月29日時点で AND・OR の項目はありませんでした。ヘルプは、演算子と語の間にスペースを入れないよう注意しています(site: nytimes.com は通常の検索になる)。

よくあるエラー・つまずき(原文と直し方)

この節では、boolean まわりで手元に出たエラーと、気付きにくい誤動作の原因と直し方が一覧で分かります。

症状・エラー原文 原因 直し方
NameError: name 'true' is not defined. Did you mean: 'True'? Python で小文字の true と書いた True・False と書く
ReferenceError: True is not defined JavaScript で大文字の True と書いた true・false と書く
SyntaxError: Unexpected token 'T', "True" is not valid JSON JSON に True・TRUE を書いた JSON は小文字の true・false だけ
incompatible types: int cannot be converted to boolean Java で整数を if の条件に置いた if (i != 0) と比較を書く
NullPointerException: Cannot invoke "java.lang.Boolean.booleanValue()" null の Boolean を if に置いた Boolean.TRUE.equals(flag) か、プリミティブの boolean にする
invalid input syntax for type boolean: "maybe" PostgreSQL が受け付けない綴り true・false・yes・no・on・off・1・0 のどれかにする
ModuleNotFoundError: No module named 'distutils' Python 3.12 以降で strtobool を使った 変換関数を自分で書く
"false" を渡したのに真になる 文字列を bool() で変換した 決まった文字列と比べて変換する
YAML の no・off・NO が false になる YAML 1.1 の読み手(PyYAML 等) 文字列は引用符で囲む。真偽値は true・false で書く
JS で空の配列なのに if に入る [] は truthy arr.length === 0 で判定する
C で flag == true が偽になる flag が 1 以外の真(2 など) if (flag) と書き、true と比べない
件数 0 が既定値に置き換わる count || 10 の || が 0 を偽とみなした count ?? 10 を使う

比較の書き方で起きること

Python で True is 1 と書くと、SyntaxWarning: "is" with 'int' literal. Did you mean "=="? という警告が出て、結果は False でした。is は同じオブジェクトかどうかを見る演算子です。True・False・None は1つしか存在しないので x is True は使えますが、ふつうは if x: と書けば済むため、PEP 8 も == True での比較を避けるよう書いています。

booleanを使うか・別の型にするかの判断表

この節では、フラグを boolean で持つべき場面と、列挙型(enum)や日時にしたほうがよい場面、変数名の付け方が分かります。

boolean は「はい・いいえ」で答えられ、これからも3つ目の状態が増えない情報に使います。 状態が増えそうなもの、いつそうなったかが要るものは、別の型にしたほうが後で困りません。

持ちたい情報 向く型 理由
メールを受け取るか boolean はい・いいえで答えられ、増えない
注文の状態(受付・発送・完了) 列挙型・文字列 is_shipped・is_done と boolean を増やすと矛盾する組み合わせが生まれる
退会したか 日時(NULL なら未退会) いつ退会したかが後で要る
同意したか(未回答もある) NULL を許す boolean か列挙型 「未回答」と「いいえ」を分ける
関数の動きを切り替える引数 名前付き引数・列挙型 save(true, false) は呼ぶ側から意味が読めない

状態の数が増えるにつれて、boolean から別の型へ移る目安は次のとおりです。

  1. 12状態で増えない → booleanis_active・has_image・can_edit
  2. 2「未設定」がある → NULL を許す booleanSQL では IS NOT TRUE などで3値を意識する
  3. 3いつ起きたかが要る → 日時の列deleted_at・published_at(NULL なら未発生)
  4. 43状態以上・増える見込み → 列挙型status = 'draft' | 'published' | 'archived'

boolean の変数名の付け方

  • is・has・can・should で始める:isActive・hasPermission・canEdit のように、名前を読むと「はい・いいえ」の問いになる形にします。
  • 否定の名前を避ける:isNotHidden は !isNotHidden と書いたときに読みにくくなります。isVisible のように肯定の名前にします。
  • フラグ引数を増やさない:render(true, false, true) のような呼び出しは、名前付き引数(Python の render(cache=True))か、関数を分けて意味が読める形にします。

よくある質問

Q. booleanとは何ですか? A. 真(true)か偽(false)の2つの値だけをとるデータ型です。真偽値・ブール型・論理型とも呼びます。比較の結果や、オン・オフのフラグに使います。

Q. boolean の読み方は? A. 「ブーリアン」です。数学者ジョージ・ブールの名前から来ています。型名としては bool(ブール)と短く書く言語もあります。

Q. ブール型と真偽値と論理型の違いは? A. 同じものです。「真偽値」は true・false という値、「ブール型」「論理型」はその値をとる型を指して使い分けることがありますが、ふつうは区別しません。

Q. true と false は大文字ですか、小文字ですか? A. 言語で決まっています。Python は True・False、JavaScript・Java・C(stdbool.h)・JSON は true・false、SQL は大文字小文字を区別せず TRUE・FALSE と書くのが一般的です。

Q. 0 は false ですか? A. Python・JavaScript・PHP・C では 0 は偽として扱われます。Ruby では 0 も真です。Java・Go・Rust では 0 を条件に置くとコンパイルエラーになります。

Q. 空の配列は true ですか、false ですか? A. Python と PHP では偽、JavaScript と Ruby では真でした。JavaScript で空かどうかを確かめるときは arr.length === 0 と書きます。

Q. 文字列の "false" を if に入れると? A. Python・JavaScript・PHP・Ruby では真になります。文字列を真偽値として扱うときは、"true"・"false" などと比べて変換します。

Q. boolean は何バイトですか? A. 情報量は1ビットですが、メモリ上は1バイト以上を使うのがふつうです。C の sizeof(bool) は 1、PostgreSQL の boolean 列も1バイトです。大量に持つときはビット列を使う方法があります。

Q. 短絡評価とは何ですか? A. AND の左が偽、OR の左が真のように、左側だけで結果が決まるときに右側を実行しない仕組みです。null チェックを左に置いて、null のときに中身を見に行かないように使います。

Q. YAML で yes と書くと true になりますか? A. 読み込むライブラリで変わります。PyYAML と Ruby の Psych では true、ruamel.yaml・js-yaml では文字列の "yes" のままでした。真偽値は true・false で書き、文字列は引用符で囲むと、どのライブラリでも同じ結果になります。

Q. MySQL に boolean 型はありますか? A. BOOLEAN と書けますが、MySQL のマニュアルによると TINYINT(1) の同義語で、中身は整数です。TRUE は 1、FALSE は 0 の別名なので、2 が入っていると = TRUE では見つかりません。

まとめ

  • boolean は真(true)と偽(false)の2値をとる型。真偽値・ブール型・論理型は同じもので、検索の「ブール検索」は AND・OR・NOT で条件を組む別の話。
  • boolean 以外を条件に置いたときの扱いは言語で違う。空の配列は Python・PHP で偽、JavaScript・Ruby で真。Ruby は 0 も真。Java・Go・Rust はコンパイルエラーにする。
  • 文字列 "false" は試した動的言語すべてで真。文字列は決まった綴りと比べて変換し、当たらなければエラーにする。
  • SQL の boolean は NULL を含む3値。WHERE NOT active は NULL の行を返さない。MySQL・SQLite の boolean は整数。
  • YAML の yes・no・on・off は、PyYAML・Psych では真偽値、ruamel.yaml・js-yaml では文字列。真偽値は true・false、文字列は引用符で書く。

参考・出典

確認日はいずれも 2026年10月29日です。

  • Python ドキュメント「組み込み型」真理値判定・ブール演算:https://docs.python.org/ja/3/library/stdtypes.html
  • Python「PEP 632 – Deprecate distutils module」:https://peps.python.org/pep-0632/
  • Python「PEP 8 – Style Guide for Python Code」:https://peps.python.org/pep-0008/
  • MDN「Boolean」:https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Boolean
  • MDN「Falsy」:https://developer.mozilla.org/ja/docs/Glossary/Falsy
  • MDN「Null 合体演算子 (??)」:https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Nullish_coalescing
  • PostgreSQL 16 ドキュメント「8.6. Boolean Type」:https://www.postgresql.org/docs/16/datatype-boolean.html
  • MySQL 8.4 Reference Manual「13.1.1 Numeric Data Type Syntax」:https://dev.mysql.com/doc/refman/8.4/en/numeric-type-syntax.html
  • SQLite「Datatypes In SQLite」:https://www.sqlite.org/datatype3.html
  • SQLite「SQLite FTS5 Extension」:https://www.sqlite.org/fts5.html
  • YAML「Boolean Language-Independent Type for YAML Version 1.1」:https://yaml.org/type/bool.html
  • YAML「YAML Ain't Markup Language Version 1.2.2」:https://yaml.org/spec/1.2.2/
  • Oracle「Boolean (Java SE 21 & JDK 21)」:https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Boolean.html
  • PHP マニュアル「論理型 (boolean)」:https://www.php.net/manual/ja/language.types.boolean.php
  • Google 検索ヘルプ「Google 検索の絞り込み」:https://support.google.com/websearch/answer/2466433?hl=ja

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「booleanとは?真偽値・ブール型の意味と「真とみなされる値」を8言語で比較」

株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。

WE ARE HIRING

RJCで一緒に開発しながら、
成長を楽しみませんか?

RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!

  • 127日年間休日
  • 12時間平均残業時間
  • 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!

ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。

ABOUT RJC RJCがどんな会社か知る 考え方、研修、働き方、福利厚生、社員の前職まで。RJCのことが丸わかり! RJC丸わかりページへ JOB DESCRIPTION 仕事内容・待遇を見てみる 仕事内容、給与・待遇、選考の流れ。経験者も未経験も!応募前に知りたいこと、まとめました! 募集要項を見る ENTRY エントリーする エントリーは1〜2分・履歴書不要です。まずは話を聞いてみたい、という方でも歓迎です! エントリーフォームへ
参加受付中

AI駆動開発、 無料セミナー