INT(3)列不会剪切值到适当的长度,并允许插入完整的值 - MySQL

19 浏览
0 Comments

INT(3)列不会剪切值到适当的长度,并允许插入完整的值 - MySQL

我有一个INT(3) UNSIGNED列。如果我插入一个字符长度大于3的值,它不会截断该值,而是将其插入。

发生了什么?

0
0 Comments

INT(3)列没有将值裁剪为适当的长度,并允许完整的值被插入的原因是,INT(3)中的数字3并不是限制存储值的长度,而是指定了显示宽度。在MySQL中,INT数据类型的大小表示显示宽度,而不是存储大小。因此,如果指定的显示宽度大于实际值的位数,将会在左侧填充0以满足指定宽度的要求。这就是ZEROFILL的作用。

解决方法是根据需要调整列的数据类型和显示宽度。可以使用ALTER TABLE语句修改表结构,通过更改列的数据类型和显示宽度来解决问题。如果不需要ZEROFILL功能,可以将列的数据类型更改为INT(1),这样就不会填充0了。如果需要ZEROFILL功能并且要限制显示宽度,可以将列的数据类型更改为INT(4) zerofill,并在显示宽度之前使用0填充。

以下是解决问题的示例代码:

-- 创建表并插入数据
CREATE TABLE a (a TINYINT);
INSERT INTO a VALUES (100);
-- 修改列的数据类型和显示宽度
ALTER TABLE a CHANGE a a TINYINT(1);
-- 查询结果
SELECT * FROM a;

-- 创建表并插入数据
CREATE TABLE b (b INT(4));
INSERT INTO b VALUES (10000);
-- 修改列的数据类型和显示宽度
ALTER TABLE b CHANGE b b INT(11) ZEROFILL;
-- 查询结果
SELECT * FROM b;

通过以上步骤,可以解决INT(3)列不裁剪值的问题,并根据需要设置适当的数据类型和显示宽度。

0
0 Comments

MySQL中的INT(3)列没有剪切值的长度并允许完整值插入的问题是由于INT(3)的显示宽度属性不限制整数的容量,它仅仅在右侧填充零。实际上,它可以存储从零开始的整数,最大值为4294967295。

解决方法是使用display width属性不会影响数据存储的方式,它只影响数据的显示。

示例代码如下:

CREATE TABLE tableName
(
    x INT(3) ZEROFILL NOT NULL, 
    y INT NOT NULL
);
INSERT INTO tableName (x,y) VALUES
(1, 1),
(12, 12);
SELECT x, y FROM tableName;

结果如下:

  x          y
001          1
012         12

更多详情请参考MySQL官方文档中的[Integer Types (Exact Value)](http://dev.mysql.com/doc/refman/5.0/en/integer-types.html)章节。

0