尚硅谷之MySQL基础
第6章MySQL的数据类型
常用的数据类型有:
- 整型(xxxint)
- 位类型(bit)
- 浮点型(float和double、real)
- 定点数(decimal,numeric)
- 日期时间类型(date,time,datetime,year)
- 字符串(char,varchar,xxxtext)
- 二进制数据(xxxBlob、xxbinary)
- 枚举(enum)
- 集合(set)
1、整数(xxxint)
整数类型 |
字节 |
最小值(有符号/无符号) |
最大值(有符号/无符号) |
TINYINT |
1 |
-128/0 |
127/255 |
SMALLINT |
2 |
-32768/0 |
32767/65535 |
MEDIUMINT |
3 |
-8388608/0 |
8388607/1677215 |
INT、INTEGER |
4 |
-2147483648/0 |
2147483647/4294967295 |
BIGINT |
8 |
-9223372036854775808/0 |
9223372036854775807/18446744073709551615 |
整数列的可选属性有三个:
- M: 宽度(在0填充的时候才有意义,否则不需要指定)
- unsigned: 无符号类型(非负)
- zerofill: 0填充,(如果某列是zerofill,那么默认就是无符号),如果指定了zerofill只是表示不够M位时,用0在左边填充,如果超过M位,只要不超过数据存储范围即可
原来,在 int(M) 中,M 的值跟 int(M) 所占多少存储空间并无任何关系。 int(3)、int(4)、int(8) 在磁盘上都是占用 4 bytes 的存储空间。
2、浮点型
对于浮点列类型,在MySQL中单精度值使用4个字节,双精度值使用8个字节
- MySQL允许使用非标准语法(其他数据库未必支持,因此如果设计到数据迁移,则最好不要这么用):FLOAT(M,D)或DOUBLE(M,D)。这里,(M,D)表示该值一共显示M位,其中D表示小数点后几位,M和D又称为精度和标度。例如,定义为FLOAT(5,2)的一个列可以显示为-999.99-999.99。M取值范围为0~255。D取值范围为0~30,同时必须<=M。
- 如果存储时,整数部分超出了范围(如上面的例子中,添加数值为01),MySql就会报错,不允许存这样的值。如果存储时,小数点部分若超出范围,就分以下情况:若四舍五入后,整数部分没有超出范围,则只警告,但能成功操作并四舍五入删除多余的小数位后保存,例如在FLOAT(5,2)列内插入999.009,近似结果是999.01。若四舍五入后,整数部分超出范围,则MySql报错,并拒绝处理。如999.995和-999.995都会报错。
- 说明:小数类型,也可以加unsigned,但是不会改变数据范围,例如:float(3,2) unsigned仍然只能表示0-9.99的范围。
- float和double在不指定精度时,默认会按照实际的精度(由实际的硬件和操作系统决定)来显示
- REAL就是DOUBLE ,如果SQL服务器模式包括REAL_AS_FLOAT选项,REAL是FLOAT的同义词而不是DOUBLE的同义词。
注意:在编程中,如果用到浮点数,要特别注意误差问题,因为浮点数是不准确的,所以我们要避免使用“=”来判断两个数是否相等。如果希望保证值比较准确,推荐使用定点数数据类型。