MySQL 必知必会
朱晓峰
前摩根大通银行技术部副总裁、系统架构师
立即订阅
785 人已学习
课程目录
已更新 5 讲 / 共 34 讲
0/4登录后,你可以任选4讲全文学习。
课前准备 (2讲)
开篇词 | 在实战中学习,是解锁MySQL技能的最佳方法
免费
环境准备 | 带你安装MySQL和图形化管理工具Workbench
实践篇 (3讲)
01 | 存储:一个完整的数据存储过程是怎样的?
02 | 字段:这么多字段类型,该怎么定义?
03 | 表:怎么创建和修改表?
MySQL 必知必会
15
15
1.0x
00:00/00:00
登录|注册

02 | 字段:这么多字段类型,该怎么定义?

朱晓峰 2021-03-11
你好,我是朱晓峰。
MySQL 中有很多字段类型,比如整数、文本、浮点数,等等。如果类型定义合理,就能节省存储空间,提升数据查询和处理的速度,相反,如果数据类型定义不合理,就有可能会导致数据超出取值范围,引发系统报错,甚至可能会出现计算错误的情况,进而影响到整个系统。
之前,我们就遇到过这样一个问题:在销售流水表中,需要定义商品销售的数量。由于有称重商品,不能用整数,我们想当然地用了浮点数,为了确保精度,我们还用了 DOUBLE 类型。结果却造成了在没有找零的情况下,客人无法结账的重大错误。经过排查,我们才发现,原来 DOUBLE 类型是不精准的,不能使用。
你看,准确地定义字段类型,不但关系到数据存储的效率,而且会影响整个信息系统的可靠性。所以,我们必须要掌握不同字段的类型,包括它们的适用场景、定义方法,这节课,我们就聊一聊这个问题。
首先,我要说的是 MySQL 中最简单的数据类型:整数类型。

整数类型

整数类型一共有 5 种,包括 TINYINT、SMALLINT、MEDIUMINT、INT(INTEGER)和 BIGINT,它们的区别如下表所示:
这么多整数类型,咱们该怎么选择呢?
其实,在评估用哪种整数类型的时候,你需要考虑存储空间和可靠性的平衡问题:一方面,用占用字节数少的整数类型可以节省存储空间;另一方面,要是为了节省存储空间,使用的整数类型取值范围太小,一旦遇到超出取值范围的情况,就可能引起系统错误,影响可靠性。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《MySQL 必知必会》,如需阅读全部文章,
请订阅文章所属专栏
立即订阅
登录 后留言

精选留言(8)

  • 朱晓峰 置顶
    你好,我是朱晓峰,下面我就来公布一下上节课思考题的答案:

    上节课,我们学习了数据存储的完整过程,包括创建数据库、数据表、确认字段和插入数据。下面是思考题的答案:
     
    设计销售表如下:
     
    CREATE TABLE demo.sales
    (
             goodsname text,
             salesprice decimal(10,2),
             quantity decimal(10,3),
             salesvalue decimal(10,2)
    );

    作者回复: 供大家参考

    2021-03-11
    2
    2
  • lesserror
    今天的MySQL查漏补缺来了。虽然MySQL的数据类型就那么几种,但是在实际的项目中还是有很多人在定义表字段的时候选择了不合适的数据类型,导致后期维护成本增加。

    例如文中说的,在对精度有要求的字段中没有使用DECIMAL数据类型,反而选用了FLOAT、DOUBLE数据类型。我经手过的很多老项目也喜欢用INT类型来存时间戳,这种时间存取方式很麻烦而且也不直观。我个人也是持和老师相同的观点,采用DATETIME类型来存时间字段。因为虽然 DATETIME 类型占用的存储空间最多,但是它表达的时间最为完整,取值范围也最大。

    另外,关于小数点精度丢失的那部分内容,老师解释的很准确。

    作者回复: 技术服务于业务,根据业务需要决定类型定义

    2021-03-11
    1
  • 陈启年
    朱老师,Text类型这段文字:
    “TEXT 类型也有 4 种,它们的区别就是最大长度不同。TINYTEXT:占用 255 字符。TEXT: 占用 65535 字符...”
    此处的“字符”改为“字节”,是否更加严谨

    作者回复: 这里用字符,侧重点在数据类型的使用上,表示这个数据类型的最多可以放多少个字符。这里假设是ASCII码,因此一个字符就是一个字节。字节侧重存储,意思是这个数据类型的数据最大需要占用多少存储空间。比如,tinytext类型最多可以存放255个字符,但是最多占用的存储空间是256个字节,因为有一个字节用来存储字符串长度。

    2021-03-12
  • lesserror
    老师,实际的业务中在存字符串的时候,更多的还是用CHAR(M) 和 VARCHAR(M)类型,TEXT相对较少。

    结尾总结中:“同时,我们还清楚了为什么整数类型用得少。” 没太明白,整数类型日常使用比较多的呀。
    2021-03-12
    2
  • 一步
    为什么浮点数无符号取值范围的右边界也是个范围呢,

    作者回复: 这是因为,浮点数的取值范围可以有2种方式来确定,一种方式是小数点放在在最前面,这样得出最小的无符号数,另外一种是把小数点放在最后,这样得出最大的无符号数

    2021-03-11
    1
  • 海明
    朱老师,我看上面有个例子是这样写的,但是sum可以这样使用吗。sum函数在where这里。
    SELECT *
    FROM demo.goodsmaster
    WHERE SUM(price)=1.1

    作者回复: 这样写是不行的,SUM是聚合函数,一般要跟GROUP BY 关键字一起使用,比如,你有一个商品信息表demo.goodsmaster,其中有3个字段,分别是barcode,goodsname,price,现在商品名称可能重复,想查一下价格合计是1.1的商品,可以这样写:
    SELECT goodsname,SUM(price)
    FROM demo.goodsmaster
    GROUP BY goodsname
    HAVIING SUM(price)=1.1;

    2021-03-11
  • 青生先森
    老师,blob的运用场景是什么呢?

    作者回复: blob是二进制字符串,比如可以把图片转换成二进制数据存入类型是blob的字段中。好处是可以像一个普通字段那样来处理图片,缺点是占用的存储资源大

    2021-03-11
  • 右耳朵猫咪
    老师好,有一些公司用分而不是用元来表示金额,存储类型是int。这种方式和decimal哪个比较好呢?

    作者回复: 还是一个精度问题。如果用分来表示金额,存储类型是INT,那么,如果场景中只有加减运算,就不会有问题。但是如果涉及到乘除运算,运算过程中出现分以下的金额,就会出现精度损失的问题。所以,还是要根据实际的业务场景,来决定。

    2021-03-11
    2
收起评论
8
返回
顶部