- 技術 💻
booleanとは?真偽値・ブール型の意味と「真とみなされる値」を8言語で比較
結論
boolean(ブーリアン)とは、真(true)か偽(false)の2つの値だけをとるデータ型です。日本語では真偽値・ブール型・論理型と呼びます。どの言語にもありますが、「どの値を真とみなすか」は言語ごとに違い、そこでつまずきます。
この記事でわかること
- プログラミング・SQL・検索・数学での boolean の意味の違い
- Python・JavaScript・Java・C など8言語で「真とみなされる値」を実行した結果
- YAML の yes/no、"false" が真になる問題などのエラー原文と直し方
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つです。
比較の結果
5 > 3・a == b・x in list の結果は boolean。
いちばん多い
リテラル
コードに直接 true・false と書いた値。フラグの初期値など。
言語で綴りが違う
判定する関数
isEmpty()・startswith()・Array.isArray() など。
is・has で始まる名前
変換
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ビットではない)
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']) で読むと、デバッグが有効になってしまいます。
前後の空白を取り、小文字にそろえる
" TRUE " や "Yes" を同じに扱うため、strip と lower を最初に通す。
真の文字列・偽の文字列を一覧で決める
true・1・yes・on を真、false・0・no・off を偽、のように両方を決める。片方だけ決めると、打ち間違いが黙って偽になる。
どちらにも当たらなければエラーにする
"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 から別の型へ移る目安は次のとおりです。
- 12状態で増えない → booleanis_active・has_image・can_edit
- 2「未設定」がある → NULL を許す booleanSQL では IS NOT TRUE などで3値を意識する
- 3いつ起きたかが要る → 日時の列deleted_at・published_at(NULL なら未発生)
- 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期連続の黒字決算。