31

我正在尝试BOOL使用以下脚本将值插入 MySQL (v 5.5.20) 中的数据类型:

CREATE DATABASE DBTest;
USE DBTest;
DROP TABLE IF EXISTS first;
CREATE TABLE first (id INT AUTO_INCREMENT NOT NULL PRIMARY KEY , name VARCHAR(30) ,sale  BOOL,); 
INSERT INTO first VALUES ("", "G22","TRUE");
INSERT INTO first VALUES ("", "G23","FALSE");

但是该 INSERT语句只是将(Zero) 插入到和选项0的布尔列中!你能告诉我为什么会这样吗?TRUEFALSE

4

1 回答 1

60

TRUEandFALSE是关键字,不应作为字符串引用:

INSERT INTO first VALUES (NULL, 'G22', TRUE);
INSERT INTO first VALUES (NULL, 'G23', FALSE);

通过将它们引用为字符串,MySQL 会将它们转换为等效的整数(因为布尔值在 MySQL 中实际上只是一个字节INT),对于任何非数字字符串,它都转换为零。因此,您可以获得0表中的两个值。

非数字字符串强制为零:

mysql> SELECT CAST('TRUE' AS SIGNED), CAST('FALSE' AS SIGNED), CAST('12345' AS SIGNED);
+------------------------+-------------------------+-------------------------+
| CAST('TRUE' AS SIGNED) | CAST('FALSE' AS SIGNED) | CAST('12345' AS SIGNED) |
+------------------------+-------------------------+-------------------------+
|                      0 |                       0 |                   12345 |
+------------------------+-------------------------+-------------------------+

但是关键字返回它们对应的INT表示:

mysql> SELECT TRUE, FALSE;
+------+-------+
| TRUE | FALSE |
+------+-------+
|    1 |     0 |
+------+-------+

另请注意,我已将您的双引号替换为单引号,就像更标准的 SQL 字符串附件一样。最后,我已将您的空字符串替换为idwith NULL。空字符串可能会发出警告。

于 2012-11-06T21:25:19.697 回答