一、数据类型
MySQL支持多种数据类型,主要有数值类型、日期/时间类型和字符串类型。
数值数据类型
整数类型: TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT
浮点数类型:FLOAT、DOUBLE
定点小数: DECIMAL
日期/时间类型
YEAR、TIME、DATE、DATETIME、TIMESTAMP
字符串类型,其中字符串又可以分为文本字符串和二进制字符串
文本字符串:
CHAR、VARCHAR、TEXT、ENUM、SET等
二进制字符串
BIT、BINARY、VARBINARY、BLOB
1、整数类型
数值型数据类型主要用来存储数字,MySQL提供了多种数值数据类型,不同的数据类型提供不同的取值范围,可以存储的值的范围越大,其 所需要的存储空间也会越大。整数类型的属性字段可以添加AUTO_INCREMENT自增约束条件。
MySQL中整型数据类型
从表中可以看出,不同类型整数存储所需要的字节数是不一样的,占用字节数越多的的类型所能表示的数值范围越大。根据占用字节数可以求出每一种数据类型的取值范围,如:TINYINT需要1个字节(8bits)来存储,那么TINYINT无符号数的最大值为2的8次方减1,也就是255
,TINYINT有符号数的最大值为2的7次方减1,也就是127。其他类型的整数取值范围计算方法相同。
不同整数类型的取值范围
创建表的语句:
这个例子中TINYINT(4)、INT(11) 括号中的数字表示的是该数据类型指定的显示宽度,指定能够显示的数值中数字的个数。这里要注意:
显示宽度和数据类型的取值范围是无关的,显示宽度只是指明MySQL最大可能显示的数字个数,注意是可能。通俗点讲就是,比如INT字段,显示宽度为4,但是如果你插入的数据大于4,达到了8,6666 6666,那也没关系,只要插入的数值的位数不超过该类型整数的取值范围,就行,如果插入的数值长度是2,或者3,数值的位数小于指定的宽度,后面的位数就会由空格填空,5555插入INT字段,存的就是"555 "后面用空格补齐。还有一点,这个显示宽度没限制,你写100度没问题,但是插入数据时,实际起控制作用的还是数据类型的取值范围。如果不写显示宽度,就会用系统默认的,比如,INT的默认显示宽度是11,看上面表,最高也就能表示
10位大小的数值,但是要注意,有符号的,也就是负数时,符号位也占一位。
2、浮点数类型和定点数类型
MySQL中使用浮点数和定点数来表示小数。浮点类型有两种:单精度浮点类型(FLOAT)和双精度浮点类型(DOUBLE)。定点类型只有一种:DECIMAL。浮点类型和顶点类型都可以用(M,N)来表示,其中M成为精度,表示总共的位数;N称为标度,是表示小数的位数。
MySQL中的小数类型
1、M,N表达的含义
M:数值的总位数。 通俗点讲,就是看有多少个数字,比如,5.6789,M就是5
D:小数点后面能保留几位。 比如上面的5.6789 ,D就是4。 这只是举一个例子,来说明M,D是什么,实际是先有M,D的,然后在来控制 数值,而不是更具数值来确定M,D。
不单单就MECIMAL有M,D这两个参数,FLOAT 和 DOUBLE 也有,
分析:a1的M为3,D为1,那么小数点上必须是占了一位数字,就算没有值,也会用0来填充,所以说,整数位上最多就只能是2位,这里
要切记要先根据D的值,来算整数位能最多有多少位。通过分析a1,a2和a3也就简单了,a2字段上的值,整数部分最多是2位,小数点后的位 数最多是3位,也就是说小数点后超过了3位,就会四舍五入。a3字段上的值,整数部分最多只能是一位,小数点后的位数最多是2位,如果 不足2位,也会用0补充。比如插入1.5,在数据库中存的就是1.50, 比如插入10.23,这个就会报错,因为整数部分只能是一位,小数点后的 位数已经占了2位了。
2、FLOAT、DOUBLE、DECIMAL三者的区别。
都是用来表示我们所说的小数的也就是浮点数,但是三种的精度不一样,也就是后面显示的位数不一样,
①区别一:
FLOAT显示后面的小数点位大概在40多位;
DOUBLE能显示的就是300多位了,不是一个层次上的;
DECIMAL这个小数点后面能显示的位数跟DOUBLE差不多。
②区别二:
FLOAT和DOUBLE在不指定精度时,也就是不用(M,D),默认会按照实际的精度,也就是你写多少就是多少,而DECIMAL如不指定 精度默认为(10,0),也就是如果不指定精度,插入数值56.89,在数据库中存储的就是57。所以一般使用DECIMAL时就会指定精度,而 使用FLOAT和DOUBLE就不用。
③区别三:
浮点数相对与定点数(DECIMAL)的优点就是在长度一定的情况下,浮点数能够表示更大的数据范围,但是缺点是会引起精度问题。
3、什么时候使用FLOAT、DOUBLE、DECIMAL
对精度要求比较高的时候,比如货币、科学数据等,使用DECIMAL的类型比较好。其他的时候,看你要存放的数据的大小而定了,一 般使用DOUBLE。并且在使用浮点数时需要注意,尽量避免做浮点数的比较,比如加、减,谁大谁小,这样的操作,会引起精度缺失。
3、日期与时间类型
MySQL中也有许多表示日期的数据类型,主要有:DATATIME、DATE、TIMESTAMP、TIME、和YEAR。
4、文本字符串类型
字符串类型用来存储字符串数据,除了可以存储字符串数据之外,还可以存储其他数据,比如图片和声音的二进制数据。MySQL支持两类字符型数据:文本字符串和二进制字符串。
文本字符串数据类型
二进制字符串类型
二、如何选择数据类型
1、整数和浮点数
如果不需要小数部分,则使用整数来保存数据,并且根据整数的大小,来选择合适的整数类型,如果需要小数部分,则使用浮点数类型, 浮点数类型中,有float和double,如果需要精度高一点,则选择double。根据自己的需求来决定选什么。
2、浮点数和定点数
浮点数FLOAT、DOUBLE相对应定点数DECIMAL的优势在于:在长度一定的情况下,浮点数能表示更大的数据范围,但是浮点数容易产 生误差,因此在精度比较高时,建议使用DECIMAL,比如货币这一类东西,就用DECIMAL比较合理,注意浮点数在进行加减运算时也容 易出现问题。如果进行数值比较,也建议用DECIMAL
3、日期与时间类型
可以看上面详解时的图,根据各种格式,选择自己所需要的数据类型,注意TIMESTAMP和DATETIME的区别,一个是跟时区有关,一个
无关,其他没什么大的区别。
4、CHAR与VARCHAR之间的特点与选择
区别:
CHAR是固定长度字符、VARCHAR是可变长度字符。CHAR会自动删除插入数据的尾部空格,VARCHAR不会。
CHAR是固定长度,处理速度比VARCHAR更快,缺点很明显,浪费存储空间,所以对存储不大,但在速度上有要求的可以使用CHAR类 型,反之用VARCHAR。
5、ENUM和SET
ENUM只能取单值,也就是从枚举类型中选取其中一个值,但是SET可以取多值,ENUM最多能存放65535个成员,SET只能65个空字符 串也能在SET中存储,要存储一个人的喜爱时,最好使用SET类型,其实最重要的是看具体的情况在选取最为合适的把
6、BLOB和TEXT
BLOB是二进制字符串,TEXT是非二进制字符串,两者均可存放大容量的信息,BLOB主要存储图片、音频信息,而TEXT只能存储纯文 本文件。分清楚两者的用途
7、BINARY和VARBINARY
这两个的区别和CHAR与VARCHAR的区别差不多,BINARY是固定长度、VARBINARY是可变程度,这两个的作用就是为了区分大小写 的,注意这两个是字节字符串。