首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 布林型別 BOOL/BOOLEAN 與 TINYINT 實測詳解

     編輯:MySQL 綜合教學

前言

許多開發者疑惑:MySQL 是否真正支援布林型別?官方文件指出 BOOL 與 BOOLEAN 為同義詞,但實際儲存行為如何?本文透過實測揭示其真實面貌。

一、建表結構驗證

CREATE TABLE boolean_test (
  ID INT NOT NULL AUTO_INCREMENT,
  Online_Flag BOOL,
  Lock_Flag BOOLEAN,
  PRIMARY KEY(ID)
) ENGINE=InnoDB CHARSET=utf8;

使用 SHOW CREATE TABLE 檢視實際結構:

CREATE TABLE `boolean_test` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `Online_Flag` tinyint(1) DEFAULT NULL,
  `Lock_Flag` tinyint(1) DEFAULT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

結論 1:MySQL 會自動將 BOOL/BOOLEAN 轉換為 TINYINT(1),且不發出任何警告。

二、資料寫入測試

INSERT INTO boolean_test(Online_Flag, Lock_Flag) VALUES (TRUE, FALSE);  -- OK
INSERT INTO boolean_test(Online_Flag, Lock_Flag) VALUES (1, 0);         -- OK
INSERT INTO boolean_test(Online_Flag, Lock_Flag) VALUES (2, -1);        -- OK(超出布林範圍)
INSERT INTO boolean_test(Online_Flag, Lock_Flag) VALUES (-128, 127);    -- OK(TINYINT 範圍內)
INSERT INTO boolean_test(Online_Flag, Lock_Flag) VALUES (-256, 256);    -- Warning: Out of range

結論 2:

  • TRUE/FALSE 為關鍵字,無需引號,分別對應 1/0。
  • 接受任意整數,超出 TINYINT 範圍(-128~127)才報警告並截斷。
  • 無嚴格布林語意限制,本質上就是有號微整數。

三、資料讀取驗證

SELECT * FROM boolean_test;
+----+-------------+-----------+
| ID | Online_Flag | Lock_Flag |
+----+-------------+-----------+
|  1 |           1 |         0 |
|  2 |           1 |         0 |
|  3 |           2 |        -1 |
|  4 |         -128 |       127 |
|  5 |         -128 |       127 |
+----+-------------+-----------+

結論 3:

  • 儲存值即寫入值(經截斷),TRUE/FALSE 存為 1/0。
  • 查詢結果為數值,非 TRUE/FALSE 字面值。
  • BOOL/BOOLEAN 功能完全等同 TINYINT(1)。

實務建議

  1. 若需嚴格布林語意,應在應用層或透過 CHECK 條件約束(MySQL 8.0.16+ 支援)限制值為 0/1。
  2. 遷移其他資料庫(如 PostgreSQL 真正的 BOOLEAN)時注意語意差異。
  3. 使用 TINYINT(1) 並加註釋 COMMENT '0=false, 1=true' 更明確。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved