为什么TINYINT(1)
作为布尔值工作?我理解官方文档的方式,(1)应该意味着它的显示宽度为1,所以如果我将56
存储在其中,我认为它应该打印5
。但由于某种原因,它始终打印1
或0
。
另一种情况是,如果我将56
存储在INT(1)
中,则会打印56
(至少根据SQLFiddle)。这是怎么回事?
答案 0 :(得分:21)
MySQL整数类型括号中的(1)与数据类型接受的值范围或存储方式无关。它只用于显示。
另请参阅我对Types in MySQL: BigInt(20) vs Int(20) etc的回答。
TINYINT与TINYINT(1)或TINYINT(2)或TINYINT(64)没什么区别。它是一个8位有符号整数数据类型,它接受-128到127之间的任何8位整数值。
mysql> create table b (i tinyint(1));
mysql> insert into b values (42);
mysql> select * from b;
+------+
| i |
+------+
| 42 |
+------+
为方便起见,MySQL支持BOOL的别名,它由TINYINT(1)立即替换。
mysql> create table b2 (i bool);
mysql> show create table b2;
CREATE TABLE `b2` (
`i` tinyint(1) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1
正如我所说,(1)的使用几乎没有任何意义,它只是一个惯例,所以如果你看到TINYINT(1),那么假定该列意图用作一个列是合理的布尔值。但MySQL中没有任何内容阻止您在其中存储其他整数值。
如果您希望列仅接受 0或1,则可以使用BIT(1):
mysql> create table b3 (i bit(1));
mysql> insert into b3 values (0), (1);
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> insert into b3 values (-1);
ERROR 1406 (22001): Data too long for column 'i' at row 1
mysql> insert into b3 values (2);
ERROR 1406 (22001): Data too long for column 'i' at row 1
但是,与TINYINT相比,这不会节省任何空间,因为给定列的存储量会向上舍入到最接近的字节。
PS:尽管来自@ samdy1的答案,但TINYINT根本不存储字符串 '0'
或'1'
,它存储整数 {{1或者0
,以及-128到127之间的其他整数。没有必要在SQL中引用整数,我常常为很多开发人员所做的事感到困惑。
答案 1 :(得分:8)
TINYINT
列可以存储从-128
到127
的数字。
TINYINT(1)
虽然有点奇怪。它(可能是因为它应该充当BOOLEAN
数据类型),在某些上下文中仅返回0
和1
,同时它仍保留存储的(-128到127)值
(更正:我只在SQL-Fiddle中看到这种奇怪的行为,而不是在本地访问MySQL时,所以它可能是一个SQL-Fiddle的怪癖,可能与{{1}的等效性有关})而不是MySQL问题。
请参阅 SQL-Fiddle
BOOLEAN
我们得到的地方(仅限于SQL-Fiddle,否则我们不会访问MySQL!):
CREATE TABLE test
( i TINYINT(1)
) ;
INSERT INTO test
(i)
VALUES
(0), (1), (6), (120), (-1) ;
但:
SELECT i
FROM test ;
i
-----
0
1
1
1
1
答案 2 :(得分:6)
这是一个mysql Jdbc配置主题。
您可以通过将jdbc url配置属性“tinyInt1isBit”设置为“true”(默认值)或“false”来配置mysql jdbc以将TinyInt(1)转换为Boolean或Integer。
来自:https://dev.mysql.com/doc/connector-j/en/connector-j-reference-configuration-properties.html
驱动程序是否应将数据类型TINYINT(1)视为BIT类型(因为服务器在创建表时会以静默方式转换BIT - > TINYINT(1))?
默认值:true
答案 3 :(得分:3)
引擎很聪明,知道TINYINT(1)
和BOOL
是相同的。但是INT(1)
仅影响显示宽度而不影响基础存储大小。显示宽度仅在宽度小于显示宽度时才起作用。然后它被填补。
http://alexander.kirk.at/2007/08/24/what-does-size-in-intsize-of-mysql-mean/
答案 4 :(得分:0)
据我了解,TINYINT(1)
只能保留'0'
或'1'
(根据自己的经验)。
因此,可以假设'0'
或'1'
被翻译为true
或false
。