MySQL列类型之——数值类型
如想进一步了解有关mysql的信息请点击http://dev.mysql.com/doc/refman/5.1/zh/column-types.html
MySQL支持多种列类型:数值类型、日期/时间类型和字符串(字符)类型。本章首先对数值类型进行了介绍。几种列类型描述使用了下述惯例:
· M
表示最大显示宽度。最大有效显示宽度是255。
· D
适用于浮点和定点类型,并表示小数点后面的位数。最大可能的值是30,但不应大于M-2。
· 方括号(‘[’和‘]’)表示可选部分。
类型 |
|
范围 |
字节 |
备注 |
BIT[(M)] |
位字段类型 |
M表示每个值的位数,范围为从1到64。如果M被省略, 默认为1。 要指定位值,可以使用b\’value\’符。value是一个用0和1编写的二进制值。例如,b\’111\’和b\’100000000\’分别表示7和128。
|
大约(M+7)/8个字节
|
2.如果为BIT(M)列分配的值的长度小于M位,在值的左边用0填充。例如,为BIT(6)列分配一个值b\’101\’,其效果与分配b\’000101\’相同 |
TINYINT[(M)] [UNSIGNED] [ZEROFILL |
很小的整数 |
带符号的范围是-128到127。 无符号的范围是0到255。 |
1 |
|
BOOL,BOOLEAN |
是TINYINT(1)的同义词 |
zero值被视为假。非zero值视为真。 |
1 |
|
SMALLINT[(M)] [UNSIGNED] [ZEROFILL] |
小的整数 |
带符号的范围是-32768到32767。 无符号的范围是0到65535。 |
2 |
|
MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL] |
中等大小的整数 |
带符号的范围是-8388608到8388607。 无符号的范围是0到16777215。 |
3 |
|
INT[(M)] [UNSIGNED] [ZEROFILL] |
普通大小的整数 |
带符号的范围是-2147483648到2147483647。无符号的范围是0到4294967295。 |
4 |
|
INTEGER[(M)] [UNSIGNED] [ZEROFILL] |
INT的同义词。 |
|
4 |
|
BIGINT[(M)] [UNSIGNED] [ZEROFILL] |
大整数 |
带符号的范围是-9223372036854775808到9223372036854775807。 无符号的范围是0到18446744073709551615。 |
8 |
|
FLOAT[(M,D)] [UNSIGNED] [ZEROFILL] |
小(单精度)浮点数 |
允许的值是-3.402823466E+38到-1.175494351E-38、0和1.175494351E-38到3.402823466E+38。 |
4 |
1.
|
DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL] |
普通大小(双精度)浮点数 |
允许的值是-1.7976931348623157E+308到-2.2250738585072014E-308、0和2.2250738585072014E-308到 1.7976931348623157E+308。 |
8 |
1.
|
DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL] |
压缩的“严格”定点数 |
小数点和(负数)的‘-’符号不包括在M中。如果D被省略, 默认是0。如果M被省略, 默认是10。DECIMAL整数最大位数(M)为65。支持的十进制数的最大位数(D)是30。 |
M+2 |
1.
|
M指示最大显示宽度。最大有效显示宽度是255。显示宽度与存储大小或类型包含的值的范围无关。
如果为一个数值列指定ZEROFILL,MySQL自动为该列添加UNSIGNED属性。
SERIAL是BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE的一个别名。
在整数列定义中,SERIAL DEFAULT VALUE是NOT NULL AUTO_INCREMENT UNIQUE的一个别名。
警告:应当清楚,当使用在整数值(其中一个是UNSIGNED类型)之间使用减号时,结果是无符号。
使用浮点数可能会遇到意想不到的问题,因为在MySQL中的所有计算用双精度完成
注:
1. 当结合可选扩展属性ZEROFILL使用时, 默认补充的空格用零代替。例如,对于声明为INT(5) ZEROFILL的列,值4检索为00004。请注意如果在整数列保存超过显示宽度的一个值,当MySQL为复杂联接生成临时表时会遇到问题,因为在这些情况下MySQL相信数据适合原列宽度。
2. 所有整数类型可以有一个可选(非标准)属性UNSIGNED。当你想要在列内只允许非负数和该列需要较大的上限数值范围时可以使用无符号值。浮点和定点类型也可以为UNSIGNED。同数类型,该属性防止负值保存到列中。然而,与整数类型不同的是,列值的上范围保持不变。
3. 应清楚BIGINT列的下述内容:
a. 使用带符号的BIGINT或DOUBLE值进行所有算法,因此除了位函数,不应使用大于9223372036854775807(63位)的无符号的大整数! 如果这样做,结果中的最后几位可能出错,这是由于将BIGINT值转换为DOUBLE进行四舍五入时造成的错误。
b. 总是可以使用一个字符串在BIGINT列中保存严格整数值。在这种情况下,MySQL执行字符串–数字转换,其间不存在双精度表示。
c. 当两个操作数均为整数值时,–、+和* 操作符使用BIGINT算法。这说明如果乘两个大整数(或来自返回整数的函数),当结果大于9223372036854775807时,会得到意想不到的结果。
4. 所有整数类型可以有一个可选(非标准)属性UNSIGNED。当你想要在列内只允许非负数和该列需要较大的上限数值范围时可以使用无符号值。浮点和定点类型也可以为UNSIGNED。同数类型,该属性防止负值保存到列中。然而,与整数类型不同的是,列值的上范围保持不变。
5. MySQL允许使用非标准语法:FLOAT(M,D)或REAL(M,D)或DOUBLE PRECISION(M,D)。这里,“(M,D)”表示该值一共显示M位整数,其中D位位于小数点后面。例如,定义为FLOAT(7,4)的一个列可以显示为-999.9999。MySQL保存值时进行四舍五入,因此如果在FLOAT(7,4)列内插入999.00009,近似结果是999.0001。
6. DECIMAL和NUMERIC类型在MySQL中视为相同的类型。它们用于保存必须为确切精度的值,例如货币数据。当声明该类型的列时,可以(并且通常要)指定精度和标度;例如:salary DECIMAL(5,2)在该例子中,5是精度,2是标度。精度表示保存值的主要位数,标度表示小数点后面可以保存的位数。
7. SQL模式
a. 当要在一个数值列内保存一个超出该列允许范围的值时,MySQL的操作取决于此时有效的SQL模式。如果模式未设置,MySQL将值裁剪到范围的相应端点,并保存裁减好的值。但是,如果模式设置为traditional(“严格模式”),超出范围的值将被拒绝并提示错误,并且根据SQL标准插入会失败。
b. 如果INT列是UNSIGNED,列范围的大小相同,但其端点会变为到0和4294967295。如果你试图保存-9999999999和9999999999,以非严格模式保存到列中的值是0和4294967296。
c. 如果在浮点或定点列中分配的值超过指定(或默认)精度和标度规定的范围,MySQL以非严格模式保存表示范围相应端点的值。
d. 当MySQL没有工作在严格模式时,对于ALTER TABLE、LOAD DATA INFILE、UPDATE和多行INSERT语句,由于裁剪发生的转换将报告为警告。
e. 当MySQL工作在严格模式时,这些语句将失败,并且部分或全部值不会插入或更改,取决于是否表为事务表和其它因素。