date:3字节-日期。格式:2020-10-01
time:3字节-时间。格式:08:00:00
datetime:8字节-日期时间。格式:2020-10-01 08:00:00
timestamp:4字节-时间戳。2020-10-01 08:00:00
year:1字节-年份。2020
tinyint:1字节。有符号范围(-128~127),无符号范围(0~255)
smallint:2字节。有符号范围(-32768~32767),无符号范围(0~65535)
mediumint:3字节。有符号范围(-8388608~8388607),无符号范围(0~16777215)
int:4字节。有符号范围(-2147483648~2147483647),无符号范围(0~4294967295)
bigint:8字节。有符号范围(-9 223 372 036 854 775 808~9 223 372 036 854 775 807),无符号范围(0~18 446 744 073 709 551 615)
无符号使用UNSIGNED修饰,有符号和无符号类型使用相同的存储空间,并具有相同的性能,因此可以根据实际情况选择合适的类型。
Mysql可以为整数类型指定宽度,例如:int(8),它不会限制值的合法范围,只是规定了显示字符的个数,对于存储和计算来说,int(1)和int(8)是相同的。
创建一个表weight内有两个字段id和weight。将weight字段限制为宽度为2。再设置为自动填充0,会得到如下结果:
float(m, d):4字节。单精度浮点型,m为总位数,d为小数点右侧位数。
double(m, d):8字节。双精度浮点型,m为总位数,d为小数点右侧位数。
decimal(m, d):m+2字节。m为总位数,d为小数点右侧位数。不仅可以存储小数部分,也支持存储比BIGINT还大的整数,decimal类型允许最多65个数字。
CPU不支持对decimal的直接计算,所以Mysql服务器自身实现了decimal的高精度计算。相对而言,CPU直接支持原生浮点计算,所以浮点运算明显更快。
浮点类型存储同样范围的值时,通常会消耗比decimal更少的空间,和整数类型一样,能选择的只是存储类型,Mysql使用double作为内部浮点计算的类型。
因为需要额外的空间和计算开销,所以应该尽量只是对小数进行精确计算时,才使用decimal-存储财务数据等。但在数据量比较大的时候,可以考虑使用bigint代替decimal,将需要存储的货币单位根据小数的位数乘以相应的倍数即可。可以同时避免浮点存储计算不精确和decimal精确计算代价高的问题。
char(n):固定长度,最多255个字符。
varchar(n):可变长度,最多65535个字符。
tinytext:可变长度,最多255个字节。
text:可变长度,最多65535个字节。
mediumtext:可变长度,最多2的24次方-1个字节。
longtext:可变长度,最多2的32次方-1个字节。
这里描述char与varchar长度的时候使用的是字符,因为当存放中文字符的时候,1个字符可以占用3个字节。意味着varchar可以存储65535个英文字符,也可以存储65535个中文字符。
关于字符串类型的固定长度与可变长度。以char和varchar为例:定义char(10),不论你存储的数据是否达到了10个字符,都会按照10个字符的长度用空格填补进行存储,所以尾部的空格会被认为是填充而丢弃。而varchar(10)是存放实际字符串加上1个字节以记录字符串的长度,所以可能比10个字节要短。