问题:
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)
,你会得到一个字节来存储数字。
使用有符号整数,这将给一个-128
到127
的范围,同时你会得到0
到255
的无符号整数:
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手册,您可以在括号中添加一个数字,但没有区别。
相关文章