arg*_*eus 14 mysql sql database sqlite phpmyadmin
为什么TINYINT(1)作为布尔值工作?我理解官方文档的方式,(1)应该意味着它的显示宽度为1,所以如果我存储56它,我认为它应该打印5.但由于某种原因,它总是打印1或0.
另一种情况是如果我存储56在一个INT(1),然后它打印56(至少根据SQLFiddle).这里发生了什么?
Bil*_*win 21
MySQL整数类型括号中的(1)与数据类型接受的值范围或存储方式无关.它只用于显示.
另请参阅我对MySQL中的类型的回答:BigInt(20)vs Int(20)等.
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 |
+------+
Run Code Online (Sandbox Code Playgroud)
为方便起见,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
Run Code Online (Sandbox Code Playgroud)
正如我所说的,(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
Run Code Online (Sandbox Code Playgroud)
但是,与TINYINT相比,这不会节省任何空间,因为给定列的存储会向上舍入到最接近的字节.
PS:尽管@ samdy1答案,TINYINT不存储字符串 '0'或'1'根本,它存储整数 0或1,以及其他整数从-128到127没有必要引用整数的SQL,和我常常纳闷为什么这么许多开发人员.
TINYINT列可以从存储的数字-128来127.
TINYINT(1)虽然有点奇怪.它(可能是因为它应该充当BOOLEAN数据类型),仅返回0并1在某些上下文中,同时它仍保留存储的(-128到127)值.
(更正:我只在SQL-Fiddle中看到这种奇怪的行为,而不是在本地访问MySQL时,所以它很可能是一个SQL-Fiddle的怪癖,可能与其等效性有关BOOLEAN)而不是MySQL问题.
请参阅SQL-Fiddle
CREATE TABLE test
( i TINYINT(1)
) ;
INSERT INTO test
(i)
VALUES
(0), (1), (6), (120), (-1) ;
Run Code Online (Sandbox Code Playgroud)
我们得到的地方(只有在SQL-Fiddle中,否则如果我们访问MySQL则不行!):
SELECT i
FROM test ;
i
-----
0
1
1
1
1
Run Code Online (Sandbox Code Playgroud)
但:
SELECT CAST(i AS SIGNED) i2
FROM test ;
i2
-----
0
1
6
120
-1
Run Code Online (Sandbox Code Playgroud)
小智 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