3.23 以前,它们为F L O AT(10, 2) 和DOUBLE(16, 4) 的同义词。自
MySQL 3.23 以来,F L O AT(4) 和F L O AT(8) 各不相同,下面还要介绍。
在选择了某种数值类型时,应该考虑所要表示的值的范围,只需选择能覆盖要取值的范围的最小类型即可。选择较大类型会对空间造成浪费,使表不必要地增大,处理起来没有选择较小类型那样有效。对于整型值,如果数据取值范围较小,如人员年龄或兄弟姐妹数,则TINYINT 最合适。MEDIUMINT 能够表示数百万的值并且可用于更多类型的值,但存储代价较大。BIGINT 在全部整型中取值范围最大,而且需要的存储空间是表示范围次大的整型I N T类型的两倍,因此只在确实需要时才用。对于浮点值, D O U B L E占用F L O AT 的两倍空间。除非特别需要高精度或范围极大的值,一般应使用只用一半存储代价的F L O AT 型来表示数据。
在定义整型列时,可以指定可选的显示尺寸M。如果这样,M 应该是一个1 到255 的整数。它表示用来显示列中值的字符数。例如, MEDIUMINT(4) 指定了一个具有4 个字符显示宽度的MEDIUMINT 列。如果定义了一个没有明确宽度的整数列,将会自动分配给它一个缺省的宽度。缺省值为每种类型的“最长”值的长度。如果某个特定值的可打印表示需要不止M 个字符,则显示完全的值;不会将值截断以适合M 个字符。对每种浮点类型,可指定一个最大的显示尺寸M 和小数位数D。M 的值应该取1 到2 5 5。D 的值可为0 到3 0,但是不应大于M - 2。(如果熟悉ODBC 术语,就会知道M 和D 对应于
ODBC 概念的“精度”和“小数点位数”)M 和D 对F L O AT 和DOUBLE 都是可选的,但对于DECIMAL 是必须的。在选项M 和D时,如果省略了它们,则使用缺省值。下面的语句创建了一个表,它说明了数值列类型的M 和D 的缺省值(其中不包括D E C I M A L,因为M 和D 对这种类型不是可选的):

如果在创建表之后使用DESCRIBE my_table 语句,则输出的Field 和Type 列如下所示(注意,如果用
MySQL 的3.23 以前的版本运行这个查询,则有一个小故障, 即BIGINT 的显示宽度将是21 而不是2 0。):

每一个数字列都具有一个由列类型所决定的取值范围。如果打算插入一个不在列范围内的值,将会进行截取:
MySQL 将剪裁该值为取值范围的边界值并使用这个结果。在检索时不进行值的剪裁。
值的剪裁根据列类型的范围而不是显示宽度进行。例如,一个SMALLINT(3) 列显示宽度为3 而取值范围为-32768 到3 2 7 6 7。值12345 比显示宽度大,但在该列的取值范围内,因此它可以插入而不用剪裁并且作为12345 检索。值99999 超出了取值范围,因此在插入时被剪裁为3 2 7 6 7。以后在检索中将以值3 2 7 6 7检索该值。
一般赋予浮点列的值被四舍五入到这个列所指定的十进制数。如果在一个F L O AT(8, 1)的列中存储1 . 2 3 4 5 6,则结果为1 . 2。如果将相同的值存入F L O AT(8, 4) 的列中,则结果为1 . 2 3 4 6。这表示应该定义具有足够位数的浮点列以便得到尽可能精确的值。如果想精确到千分之一,那就不要定义使该类型仅有两位小数。
浮点值的这种处理在
MySQL 3.23 中有例外,F L O AT(4) 和F L O AT(8) 的性能有所变化。这两种类型现在为单精度( 4 字节)和双精度( 8 字节)的类型,在其值按给出的形式存放(只受硬件的限制)这一点上说,这两种类型是真浮点类型。
DECIMAL 类型不同于F L O AT 和D E C I M A L,其中DECIMAL 实际是以串存放的。DECIMAL 可能的最大取值范围与DOUBLE 一样,但是其有效的取值范围由M 和D 的值决定。如果改变M 而固定D,则其取值范围将随M 的变大而变大。表2 - 7的前三行说明了这一点。如果固定M 而改变D,则其取值范围将随D 的变大而变小(但精度增加)。表2 - 7的后三行说明了这一点。

给定的DECIMAL 类型的取值范围取决于
MySQL 的版本。对于
MySQL 3.23 以前的版本,DECIMAL(M, D) 列的每个值占用M 字节,而符号(如果需要)和小数点包括在M 字节中。因此,类型为DECIMAL(5, 2) 的列,其取值范围为-9.99 到9 9 . 9 9,因为它们覆盖了所有可能的5 个字符的值。
正如
MySQL 3.23 一样,DECIMAL 值是根据ANSI 规范进行处理的, ANSI 规范规定DECIMAL(M, D) 必须能够表示M 位数字及D 位小数的任何值。例如, DECIMAL(5, 2) 必须能够表示从-999.99 到999.99 的所有值。而且必须存储符号和小数点,因此自
MySQL 3.23以来DECIMAL 值占M + 2 个字节。对于DECIMAL(5, 2),“最长”的值(- 9 9 9 . 9 9)需要7个字节。在正取值范围的一端,不需要正号,因此
MySQL 利用它扩充了取值范围,使其超
过了ANSI 所规范所要求的取值范围。如DECIMAL(5, 2) 的最大值为9 9 9 9 . 9 9,因为有7 个字节可用。
简而言之,在
MySQL 3.23 及以后的版本中,DECIMAL(M, D) 的取值范围等于更早版本中的DECIMAL(M + 2, D) 的取值范围。在
MySQL 的所有版本中,如果某个DECIMAL 列的D 为0,则不存储小数点。这样做的结果是扩充了列的取值范围,因为过去用来存储小数点的字节现在可用来存放其他数字了。
1. 数值列的类型属性
可对所有数值类型指定ZEROFILL 属性。它使相应列的显示值用前导零来填充,以达到显示宽度。在希望确定列值总是以给定的数字位数显示时可利用Z E R O F I L L。实际上,更准确地说是“一个给定的最小数目的数字位数”,因为比显示宽度更宽的值可完全显示而未被剪裁。使用下列语句可看到这一点:

其中SELECT 语句的输出结果如下。请注意最后一行值,它比列的显示宽度更宽,但仍然完全显示出来:

如下所示两个属性只用于整数列:
■ AUTO_INCREMENT。在需要产生唯一标识符或顺序值时,可利用AUTO_ INCREMENT属性。A U TO_INCREMENT 值一般从1开始,每行增加1。在插入NULL 到一个A U TO _INCREMENT 列时,
MySQL 插入一个比该列中当前最大值大1 的值。一个表中最多只能有一个A U TO_INCREMENT 列。对于任何想要使用A U TO_INCREMENT 的列,应该定义为NOT NULL,并定义为P R I M A RY KEY 或定义为UNIQUE 键。例如, 可按下列任何一种方式定义AUTO_INCREMENT 列:

A U TO_INCREMENT 的性能将在下一小节“使用序列”中作进一步的介绍。
■ U N S I G N E D。此属性禁用负值。将列定义为UNSIGNED 并不改变其基本数据类型的取值范围;它只是前移了取值的范围。考虑下列