日期:2014-05-16  浏览次数:20873 次

int(size)中的size到底神马意思(mysql)

(译者注:这个问题困扰了我连续几天,相关资料很少,没有明确的给出答案,也可能是笔者理解力太差,总算找到篇英文帖专门研究这个问题,学习的同时翻译了过来,与大家共同探讨)

2007,8,24 星期五 21:40 +0000 (UTC) 作者:Alexander Kirk

这个问题困扰了我很久,那就是mysql中的int(size)里的size到底干嘛使的,如果这个问题对有些人来说小菜一碟也请原谅我,对我来说mysql文档在这方面的陈述太少了。

它跟补零有关,只有使用补零功能时你才会使用它。

通常我们只在 create table 语句中使用 int(11) 这样的定义,你也可以改成 int(4)

那这意味着什么呢,在 int(11) 中你能存储比在 int(4) 中更大的数据吗

我们看看mysql文档是怎么说的

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

 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: [...]

没有关于 m 的描述,关于BOOL的词条也只仅仅谈到了它与TINYINT(1)具有相似性,没有功能

TINYINT(4) 是当你省略括号中内容时的默认项,而TINYINT(1)比如和TINYINT(4)存在某种程度上的不同,但你仍可将100存入TINYINT(1)。

最后,让我们来看看文档中关于该 m 描述最具价值的部分:

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.

(译者注:上面这段文档比较关键,所以文档就只翻译这一个)

许多数据类型描述涉及到这些变换:

M 指的是整形数据的最大显示位数,对于浮点数而言,M值则是可存储的最大数位数目,对于字串而言,M值是最大长度。M可以取的最大值取决于数据类型。

 

M 是跟显示宽度相关的,荒诞的是,比如你限制宽度为4,输入一个5位数,显示时并没有削掉一位。

如果输入值小于显示宽度,同样没什么异样,所以貌似这个显示对实际没什么影响。

限制我们引入ZEROFILL ,它具有对小于规定宽度的数值补零的特性,所以你经常会受到长度同一的数值信息,比如说发票号码。

所以我们总结一下:这里的 M 既不是字节,也不是二进制位,仅仅是显示宽度,只在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)

代码的解释比我拙劣的描述更好

(译者注:确实如此,下面几个例子很好的解释了这个问题,都是基本的mysql命令,出于对读者的尊重,就不解释也不翻译了)
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