zoukankan      html  css  js  c++  java
  • What does "size" in int(size) of MySQL mean?

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

    https://alexander.kirk.at/2007/08/24/what-does-size-in-intsize-of-mysql-mean/

    Friday, August 24th, 2007 at 21:40 +0000 (UTC) by Alexander Kirk

    I was always wondering what the size of numeric columns in MySQL was. Forgive me if this is obvious to someone else. But for me the MySQL manual lacks a great deal in this field.

    TL;DR: It's about the display width. You only see it when you use ZEROFILL.

    Usually you see something like int(11) in CREATE TABLE statements, but you can also change it to int(4).

    So what does this size mean? Can you store higher values in a int(11) than in an int(4)?

    Let's see what the MySQL manual says:

    INT[(M)] [UNSIGNED] [ZEROFILL]
    A normal-size integer. The signed range is -2147483648 to 2147483647. The unsigned range is 0 to 4294967295.

    No word about the M. The entry about BOOL suggests that the size is not there for fun as it is a synonym forTINYINT(1) (with the specific size of 1).

    TINYINT[(M)] [UNSIGNED] [ZEROFILL]
    A very small integer. The signed range is -128 to 127. The unsigned range is 0 to 255.

    BOOL, BOOLEAN
    These types are synonyms for TINYINT(1). A value of zero is considered false. Non-zero values are considered true: […]

    So TINYINT(1) must be different in some way from TINYINT(4) which is assumed by default when you leave the size out1. Still, you can store for example 100 into a TINYINT(1).

    Finally, let's come to the place of the manual where there is the biggest hint to what the number means:

    Several of the data type descriptions use these conventions:

    M indicates the maximum display width for integer types. For floating-point and fixed-point types, M is the total number of digits that can be stored. For string types, M is the maximum length. The maximum allowable value of M depends on the data type.

    It's about the display width. The weird thing is, though2, that, for example, if you have a value of 5 digits in a field with a display width of 4 digits, the display width will not cut a digits off.

    If the value has less digits than the display width, nothing happens either. So it seems like the display doesn't have any effect in real life.

    Now2 ZEROFILL comes into play. It is a neat feature that pads values that are (here it comes) less than the specified display width with zeros, so that you will always receive a value of the specified length. This is for example useful for invoice ids.

    So, concluding: The size is neither bits nor bytes. It's just the display width, that is used when the field hasZEROFILL specified.

    If you see any more uses in the size value, please tell me. I am curious to know.

    1 See this example:
    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)

  • 相关阅读:
    洛谷P1023 税收与补贴问题
    洛谷P2680 运输计划
    2014-11-3 NOIP模拟赛3
    一行Python代码就可以玩一些童年小游戏
    NuGet(微软.NET开发平台的软件包管理工具)在VisualStudio中的安装的使用
    Winform中实现序列化指定类型的对象到指定的Xml文件和从指定的Xml文件中反序列化指定类型的对象
    Electron中打开和关闭子窗口以及子窗口向父窗口传值
    Electron中实现通过webview实现内嵌网页并嵌入css样式和js脚本等
    Electron中实现拖拽文件进div中通过File对象获取文件的路径和内容
    Electron中通过process进程对象的api获取CPU、系统位数、环境变量等相关信息
  • 原文地址:https://www.cnblogs.com/kungfupanda/p/5927520.html
Copyright © 2011-2022 走看看