为表中的字段选择合适的数据类型
当一个列可以选择多种数据类型时,应该优先考虑数字类型,其次是日期或者二进制类型,最后是字符类型。对于相同级别的数据类型,应该优先选择占用空间小的数据类型。
整数类型:
tinying、smalint、mediumint、int、bigint
实数类型:
float、double、decimal(精确)
M:数值的总位数。 通俗点讲,就是看有多少个数字,比如,5.6789,M就是5
D:小数点后面能保留几位。 比如上面的5.6789 ,D就是4。 这只是举一个例子,来说明M,D是什么,实际是先有M,D的,然后在来控制数值,而不是更具数值来确定M,D。不单单就MECIMAL有M,D这两个参数,FLOAT 和 DOUBLE 度有。
都是用来表示我们所说的小数的也就是浮点数,但是三种的精度不一样,也就是后面显示的位数不一样,
区别
区别一:
FLOAT显示后面的小数点位大概在40多位,
DOUBLE能显示的就是300多位了,不是一个层次上的,
DECIMAL这个小数点后面能显示的位数跟DOUBLE差不多,
区别二:
FLOAT和DOUBLE在不指定精度时,也就是不用(M,D),默认会按照实际的精度,也就是你写多少就是多少,而DECIMAL如不指定精度默认为(10,0),也就是如果不指定精度,插入数值56.89,在数据库中存储的就是57。所以一般使用DECIMAL时就会指定精度,而使用FLOAT和DOUBLE就不用。
区别三:
浮点数相对与定点数(DECIMAL)的优点就是在长度一定的情况下,浮点数能够表示更大的数据范围,但是缺点是会引起精度问题
对精度要求比较高的时候,比如货币、科学数据等,使用DECIMAL的类型比较好。其他的时候,看你要存放的数据的大小而定了,一般使用DOUBLE。并且在使用浮点数时需要注意,尽量避免做浮点数的比较,比如加、减,谁大谁小,这样的操作,会引起精度缺失。相信在一些程序语言中,遇到过float精度丢失的问题。
字符串类型:
VARCHAR类型的存储特点
varchar用于存储变长字符串,只占用必要的存储空间
列的最长度小于255则只占用一个额外自家用于记录字符串长度
列的最大长度大于255则要占用两个额外字节用于记录字符串长度
问题:
使用最小的符合需求的长度
varchar(5)和varchar(200)存储'mysql'字符串性能不同--消耗更多内存,内存是一样的
varcher适用场景
字符串的最大长度比平均长度大很多
字符串列很少被更新
使用了多字节字符存储字符串
char存储特点:
char类型是定长的
字符串存储在char类型的列中会删除末尾的空格
char类型的最大宽度是255
适用场景
char类型适合存储所长度近似的值
char类型适合存储短字符串
char类型适合存储经常更新的字符串列
如何储存日期数据
DATATIME类型 定义宽度设置微妙 与时区无关占8个存储空间
以YYYY-MM-DD HH:MM:SS[.fraction]
范围:1000-01-01 00:00:00 到9999-12-31 23:59:59
TIMESTAMP类型
存储了格林尼治实践1970年1月1日到当前时间的秒事
以YYYY-MM-DD HH:MM:SS格式显示,占用4个字节
1970-01-01到2038-01-19
依赖显示与所制定的时区
在行的数据修改时可以自动修改timestamp列的值
date类型和time类型
只需要保存日期类型
data类型有点
1占用字节数比使用字符串、datatime、int要少,只需要3个字节
2.可以使用日期函数进行计算
1000-01-01到9999-12-31
time是HH:MM:SS 长度改变微妙
注意事项:
不要使用字符串来存储日期时间数据
占用空间少
日期时间类型在进行查找过滤时可以利用日期来进行对比
日期时间类型还有丰富的处理函数,可以方便的对时期来处理数据
使用int存储日期时间不如使用Timestatamp类型
innodb:为表中每个列选择合适的类型
主键应该可能的小
主键应该是顺序增长的,增加数据的插入效率
Innodb的主键和业务主键可以不同