MySQL的数据类型


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


日期类型

类型字节大小范围格式用途
DATE31000-01-01/9999-12-31YYYY-MM-DD日期值
TIME3‘-838:59:59’/‘838:59:59’HH:MM:SS时间值或持续时间
YEAR11901/2155YYYY年份值
DATETIME81000-01-01 00:00:00/9999-12-31 23:59:59YYYY-MM-DD HH:MM:SS混合日期和时间值
TIMESTAMP41970-01-01 00:00:00/2038结束时间是第2147483647 秒,北京时间 2038-1-19 11:14:07格林尼治时间 2038年1月19日 凌晨03:14:07YYYYMMDDHHMMSS混合日期和时间值,时间戳

字符串类型

类型范围存储所需字节说明
char(M)[0,m],m的范围[0, 2的8次方减1]m定长字符串
varchar(M)[0,m],m的范围[0, 2的16次方减1]m0-65535 字节
tinyblob0-255字节L+1不超过 255 个字符的二进制字符串
blob0-65535字节L+2二进制形式的长文本数据
mediumblob0-16777215字节L+3二进制形式的中等长度文本数据
longblob0-4294967295字节L+4二进制形式的极大文本数据
tinytext0-255字节L+1短文本字符串
text0-65535字节L+2长文本数据
mediumtext0-16777215字节L+3中等长度文本数据
longtext0-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)
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lw中

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值