MySQL的数据类型主要包括以下四大类
整数类型: bit 、 bool 、 tinyint 、 smallint 、 mediumint 、 int 、 bigint
浮点数类型: float 、 double 、 decimal
字符串类型: char 、 varchar 、 tinyblob 、 blob 、 mediumblob 、 longblob 、tinytext 、 text 、 mediumtext 、 longtext
日期类型: Date 、 DateTime 、 TimeStamp 、 Time 、 Year
整数类型
类型 | 字节数 |
---|---|
tinyint[(n)] [unsigned] | 1 |
smallint[(n)] [unsigned] | 2 |
mediumint[(n)] [unsigned] | 3 |
int[(n)] [unsigned] | 4 |
bigint[(n)] [unsigned] | 8 |
上面[]包含的内容是可选的,默认是有符号类型的,无符号的需要在类型后面跟上 unsigned
通过创建表时,为相关的列设置类型:
CREATE TABLE `test3` (
`a` int(11) DEFAULT NULL,
`b` int(5) DEFAULT NULL,
`c` int(5) unsigned DEFAULT NULL,
`d` int(5) unsigned zerofill DEFAULT NULL,
`e` int(5) unsigned zerofill DEFAULT NULL,
`f` int(10) unsigned zerofill DEFAULT NULL,
`g` int(10) unsigned zerofill DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
浮点数类型
类型 | 字节大小 | 范围(有符号) | 范围(无符号) | 用途 |
---|---|---|---|---|
float[(m,d)] | 4 | (-3.402823466E+38,3.402823466351E+38) | [0,3.402823466E+38) | 单精度浮点数值 |
double[(m,d)] | 8 | (-1.7976931348623157E+308,1.7976931348623157E+308) | [0,1.7976931348623157E+308) | 双精度浮点数值 |
decimal[(m,d)] | 对DECIMAL(M,D) ,如果M>D为M+2,否则为D+2 | 依赖于M和D的值 | 依赖于M和D的值 | 小数值 |
float数值类型用于表示单精度浮点数值,而double数值类型用于表示双精度浮点数值,float和double都是浮点型,而decimal是定点型。
浮点型和定点型可以用类型名称后加(M,D)来表示,M表示该值的总共长度,D表示小数点后面的长度,M和D又称为精度和标度。
float和double在不指定精度时,默认会按照实际的精度来显示,而DECIMAL在不指定精度时,默认整数为10,小数为0。
在为浮点型字段插入记录时需要注意以下事项:
- float和double采用的是四舍六入五成双
- 浮点数float、double如果不写精度和标度,则会按照实际显示
- decimal采用的是四舍五入
- decimal插入的数据超过精度之后会触发警告
- decimal不写精度和标度,小数点后面的会进行四舍五入,并且插入时会有警告
什么是四舍六入五成双?
就是5以下舍弃5以上进位,如果需要处理数字为5的时候,需要看5后面是否还有不为0的任何数字,如果有,则直接进位,如果没有,需要看5前面的数字,若是奇数则进位,若是偶数则将5舍掉
float 、double 会存在精度问题,decimal 精度正常的。比如银行对统计结果要求比较精准的建议使用 decimal
日期类型
类型 | 字节大小 | 范围 | 格式 | 用途 |
---|---|---|---|---|
DATE | 3 | 1000-01-01/9999-12-31 | YYYY-MM-DD | 日期值 |
TIME | 3 | ‘-838:59:59’/‘838:59:59’ | HH:MM:SS | 时间值或持续时间 |
YEAR | 1 | 1901/2155 | YYYY | 年份值 |
DATETIME | 8 | 1000-01-01 00:00:00/9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS | 混合日期和时间值 |
TIMESTAMP | 4 | 1970-01-01 00:00:00/2038结束时间是第2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨03:14:07 | YYYYMMDDHHMMSS | 混合日期和时间值,时间戳 |
字符串类型
类型 | 范围 | 存储所需字节 | 说明 |
---|---|---|---|
char(M) | [0,m],m的范围[0, 2的8次方减1] | m | 定长字符串 |
varchar(M) | [0,m],m的范围[0, 2的16次方减1] | m | 0-65535 字节 |
tinyblob | 0-255字节 | L+1 | 不超过 255 个字符的二进制字符串 |
blob | 0-65535字节 | L+2 | 二进制形式的长文本数据 |
mediumblob | 0-16777215字节 | L+3 | 二进制形式的中等长度文本数据 |
longblob | 0-4294967295字节 | L+4 | 二进制形式的极大文本数据 |
tinytext | 0-255字节 | L+1 | 短文本字符串 |
text | 0-65535字节 | L+2 | 长文本数据 |
mediumtext | 0-16777215字节 | L+3 | 中等长度文本数据 |
longtext | 0-4294967295字节 | L+4 | 极大文本数据 |
表格中的L表示存储的数据本身占用的字节,L 以外所需的额外字节为存放该值的长度所需的字节数。MySQL 通过存储值的内容及其长度来处理可变长度的值,这些额外的字节是无符号整数。
char类型占用固定长度,如果存放的数据为固定长度的建议使用char类型,如:手机号码、身份证等固定长度的信息。
数据类型选择建议
选小不选大:一般情况下选择可以正确存储数据的最小数据类型,越小的数据类型通常更快,占用磁盘,内存和CPU缓存更小。
简单就好:简单的数据类型的操作通常需要更少的CPU周期,例如:整型比字符操作代价要小得多,因为字符集和校对规则(排序规则)使字符比整型比较更加复杂。
尽量避免NULL:尽量制定列为NOT NULL,除非真的需要NULL类型的值,有NULL的列值会使得索引、索引统计和值比较更加复杂。
浮点类型的建议统一选择decimal
记录时间的建议使用int或者bigint类型,将时间转换为时间戳格式,如将时间转换为秒、毫秒,进行存储,方便走索引
时间和时间戳的相互转换
将时间转化为时间戳(如果参数为空,则处理为当前时间)
select unix_timestamp(‘2020-05-17 16:53:29’)
将时间戳转换为时间
select from_unixtime(1589705609)
转载:https://blog.csdn.net/weixin_43894879/article/details/106172728