許多開發者疑惑: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)。CHECK 條件約束(MySQL 8.0.16+ 支援)限制值為 0/1。BOOLEAN)時注意語意差異。TINYINT(1) 並加註釋 COMMENT '0=false, 1=true' 更明確。