数据库表字段类型选择

前言

​ 数据库中有很多字段结构,例如整型、浮点型、文本、日期与时间等常用类型,每个结构中又分了很多种类型,如果我们类型定义的合理,就能节省数据库的存储空间,提升数据查询和处理的速度。如何合理去定义类型?带着这个疑问,我们今天来探讨一下数据库类型的合理定义。

整型

类型有符号数取值范围无符号数取值范围占用字节数适用场景
TINYINT-128~1270~2551一般用于枚举数据,比如系统设定等取值范围很小且固定的场景
SMALLINT-32768~327670~655352可以用于较小范围的统计数据,例如统计工厂的固定资产库存数量等
MEDIUMINT-8388608~83886070~167772153用于较大整数的计算,比如车站每日的客流量
INT-2147483648~21474836370~42949672954使用最广,取值范围足够大
BIGINT写不下写不下5只有当你处理特别巨大的整数才会用到。比如双十一的交易量,大型门户的点击量

浮点数与定点数

类型描述占用字节适用场景
FLOAT单精度浮点数4浮点数有一个缺陷是不精确,所以对于精度要求高的场景并不适合使用浮点数。适用在如计算化学、分子建模、流体动力学
DOUBLE双精度浮点数8浮点数有一个缺陷是不精确,所以对于精度要求高的场景并不适合使用浮点数。适用在如计算化学、分子建模、流体动力学
DECIMAL16进制定点数定点数类型取值范围相对小,但是精准,没有误差,适合于对精度要求极高的场景比如涉及金额计算的场景

文本

CHAR与VARCHAR

CHAR:用于存储固定长度的数据,CHAR字段上索引效率极高,但是不适用于字符长度不确定的数据。例如CHAR(10),不论数据是否达到了10个字节,都会占用10个字节的空间

VARCHAR:为了解决CHAR类型存在的问题而专门设计出来的字段,但相应的会损失存储的效率。果一个字段可能的值是不固定长度的,我们只知道它不可能超过10个字符,把它定义为 VARCHAR(10)是最合适的。

​ 所以,如果需要追求空间,则选择VARCHAR,如果是要追求效率,则选择CHAR。

TEXT与BLOB

TEXT:存储可变长度的非Unicode字符数据数据。最大长度为 2^16-1个字符

MEDIUMTEXT :存储可变长度的非Unicode字符数据数据,最大长度为 16777215 (2^24-1) 个字符。

LONGTEXT :存储可变长度的非Unicode字符数据数据,最大长度为 2147483647 (2^32-1) 个字符。

TINYTEXT :存储可变长度的非Unicode字符数据数据,最大长度为 255 (2^8-1) 个字符。

与TEXT类似的数据类型是BLOB

BLOB:保存二进制数据,最大65k

TINYBLOB:保存二进制数据,最大255k

MEDIUMBLOB:保存二进制数据,最大16M

LONGBLOB:保存二进制数据,最大4G

​ 使用BLOB的优势在于文本和图片都可以以二进制的形式存储在数据库中。但是,不幸的是,现在大部分得图片都是以标签引入到前端的,而且图床和CDN的出现直接导致我们自己的数据库中只会存储文本数据,也就是说比较常用的是 TEXT

​ 需要注意的是,TEXT由于实际存储长度不固定,MySQL 不允许 TEXT 类型的字段做主键

NCHAR、NVARCHAR、NTEXT

在前面几种类型前加N。它表示存储的是Unicode数据类型的字符。

日期与时间

类型日期格式范围占用字节数
YEARYYYY1901~21551
TIMEHH:MM:SS-838:59:59~838:59:593
DATEYYYY-MM-DD1000-01-01~9999-12-33
DATETIMEYYYY-MM-DD HH:MM:SS1000-01-01 00:00:00~9999-12-31 23:59:598
TIMESTAMPYYYY-MM-DD HH:MM:SS1970-01-01 00:00:01 UTC~2038-01-1903:14:07 UTC4

​ 在实际项目中,尽量用 DATETIME 类型。因为这个数据类型包括了完整的日期和时间信息,可以确保数据的完整性和系统的稳定性,使用起来比较方便。毕竟,如果日期时间信息分散在好几个字段,就会很不容易记,而且查询的时候,SQL 语句也会更加复杂。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值