【问题标题】:INT(3) column not cliping the value to appropriate length and allowing the full value to be inserted - MySQLINT(3) 列未将值裁剪为适当的长度并允许插入完整值 - MySQL
【发布时间】:2013-01-17 20:06:09
【问题描述】:

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

发生了什么事?

【问题讨论】:

    标签: mysql int unsigned


    【解决方案1】:

    来自What does "size" in int(size) of MySQL mean?

    最后,让我们来到手册的地方,那里有 数字含义的最大提示:

    一些数据类型描述使用这些约定:

    M 表示整数类型的最大显示宽度。为了 浮点和定点类型,M是总位数 可以存储的。对于字符串类型,M 是最大长度。这 M 的最大允许值取决于数据类型。

    这与显示宽度有关。不过,奇怪的是,对于 例如,如果您在一个带显示的字段中有 5 位的值 4位宽度,显示宽度不会减少一位。

    如果值的位数少于显示宽度,则不会发生任何事情 任何一个。所以看起来显示实际上没有任何效果 生活。

    Now2 ZEROFILL 开始发挥作用。这是一个很好的功能,可以填充值 那些(这里来了)小于指定的显示宽度 零,因此您将始终收到指定的值 长度。例如,这对于发票 ID 很有用。

    所以,结论是:大小既不是位也不是字节。这只是 显示宽度,当字段指定了 ZEROFILL 时使用。

    mysql> create table a ( a tinyint );
    Query OK, 0 rows affected (0.29 sec)
    mysql> show columns from a;
    +-------+------------+------+-----+---------+-------+
    | Field | Type | Null | Key | Default | Extra |
    +-------+------------+------+-----+---------+-------+
    | a | tinyint(4) | YES | | NULL | |
    +-------+------------+------+-----+---------+-------+
    1 row in set (0.26 sec)
    
    mysql> alter table a change a a tinyint(1);
    Query OK, 0 rows affected (0.09 sec)
    Records: 0 Duplicates: 0 Warnings: 0
    
    mysql> insert into a values (100);
    Query OK, 1 row affected (0.00 sec)
    
    mysql> select * from a;
    +-----+
    | a |
    +-----+
    | 100 |
    +-----+
    1 row in set (0.00 sec)
    
    
    2 Some code to better explain what I described so clumsily.
    mysql> create table b ( b int (4));
    Query OK, 0 rows affected (0.25 sec)
    
    mysql> insert into b values (10000);
    Query OK, 1 row affected (0.00 sec)
    
    mysql> select * from b;
    +-------+
    | b |
    +-------+
    | 10000 |
    +-------+
    1 row in set (0.00 sec)
    
    mysql> alter table b change b b int(11);
    Query OK, 1 row affected (0.00 sec)
    Records: 1 Duplicates: 0 Warnings: 0
    
    mysql> select * from b;
    +-------+
    | b |
    +-------+
    | 10000 |
    +-------+
    1 row in set (0.00 sec)
    
    mysql> alter table b change b b int(11) zerofill;
    Query OK, 1 row affected (0.00 sec)
    Records: 1 Duplicates: 0 Warnings: 0
    
    mysql> select * from b;
    +-------------+
    | b |
    +-------------+
    | 00000010000 |
    +-------------+
    1 row in set (0.00 sec)
    
    mysql> alter table b change b b int(4) zerofill;
    Query OK, 1 row affected (0.08 sec)
    Records: 1 Duplicates: 0 Warnings: 0
    
    mysql> select * from b;
    +-------+
    | b |
    +-------+
    | 10000 |
    +-------+
    1 row in set (0.00 sec)
    
    mysql> alter table b change b b int(6) zerofill;
    Query OK, 1 row affected (0.01 sec)
    Records: 1 Duplicates: 0 Warnings: 0
    
    mysql> select * from b;
    +--------+
    | b |
    +--------+
    | 010000 |
    +--------+
    1 row in set (0.00 sec)
    

    【讨论】:

      【解决方案2】:

      实际上3 有一个显示宽度 适用于ZEROFILL,它在右侧填充零。它不限制整数的容量,因为它从零开始最多存储4294967295

      例子,

      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
      

      使用display width 不会影响数据的存储方式。它只影响它的显示方式。

      【讨论】:

        猜你喜欢
        • 2016-01-02
        • 1970-01-01
        • 2014-08-12
        • 1970-01-01
        • 2010-11-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多