为什么tinyint的长度没有区别?

分享于 

4分钟阅读

互联网

  繁體

问题:


MariaDB [test]> describe test;


+-------+------------+------+-----+---------+-------+


| Field | Type | Null | Key | Default | Extra |


+-------+------------+------+-----+---------+-------+


| hello | tinyint(1) | NO | | NULL | |


+-------+------------+------+-----+---------+-------+


1 row in set (0.002 sec)



MariaDB [test]> select * from test;


+-------+


| hello |


+-------+


| 20 |


+-------+


1 row in set (0.000 sec)



然后我将长度更改为大于数字的长度,希望将其用零填充到左边,但是再次不是:


MariaDB [test]> describe test;


+-------+------------+------+-----+---------+-------+


| Field | Type | Null | Key | Default | Extra |


+-------+------------+------+-----+---------+-------+


| hello | tinyint(3) | NO | | NULL | |


+-------+------------+------+-----+---------+-------+


1 row in set (0.002 sec)



MariaDB [test]> select * from test;


+-------+


| hello |


+-------+


| 20 |


+-------+


1 row in set (0.001 sec)



我使用的版本是:5.5.5-10.3.25-MariaDB-0ubuntu


答案1:

在SQL中,INTEGER类型不是由位数定义的,而是声明了可用于表示值的字节数,例如如果定义一个TINYINT(1),你会得到一个字节来存储数字。

使用有符号整数,这将给一个-128127的范围,同时你会得到0255的无符号整数:


create table test (signed_tiny tinyint(1), unsigned_tiny tinyint(1) unsigned);


insert into test (signed_tiny, unsigned_tiny) values (-128, 0), (127, 255);


select * from test;


+-------------+---------------+


| signed_tiny | unsigned_tiny |


+-------------+---------------+


| -128 | 0 |


| 127 | 255 |


+-------------+---------------+


2 rows in set (0.00 sec)



尝试从这些范围中插入值时,会得到错误消息:


insert into test (signed_tiny, unsigned_tiny) values (128, 256);


ERROR 1264 (22003): Out of range value for column 'signed_tiny' at row 1



如果您在tinyint的括号内声明一个更大的数字,则没有任何区别,因为它被静态定义为一个字节,因此仍将得到相同的错误e。


alter table test modify signed_tiny tinyint(2);


insert into test (signed_tiny) values (128);


ERROR 1264 (22003): Out of range value for column 'signed_tiny' at row 1



为避免此错误,您可以使用SMALLINT,该SMALLINT定义为使用两个字节表示值,或者使用标准SQL INT数据类型:


alter table test add signed_smallint smallint;


insert into test (signed_smallint) values (128);


Query OK, 1 row affected (0.02 sec)



根据MariaDB TINYINT手册,您可以在括号中添加一个数字,但没有区别。


相关文章