MySQL 必知必会
朱晓峰
前摩根大通银行技术部副总裁、系统架构师
17746 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 36 讲
MySQL 必知必会
15
15
1.0x
00:00/00:00
登录|注册

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

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

整数类型

整数类型一共有 5 种,包括 TINYINT、SMALLINT、MEDIUMINT、INT(INTEGER)和 BIGINT,它们的区别如下表所示:
这么多整数类型,咱们该怎么选择呢?
其实,在评估用哪种整数类型的时候,需要考虑存储空间和可靠性的平衡问题:一方面,用占用字节数少的整数类型可以节省存储空间;另一方面,要是为了节省存储空间,使用的整数类型取值范围太小,一旦遇到超出取值范围的情况,就可能引起系统错误,影响可靠性。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文介绍了MySQL中不同数据类型的选择原则,包括整数类型、浮点数类型、定点数类型、文本类型和日期时间类型。在选择整数类型时,需要平衡存储空间和可靠性,作者强调了在项目中选择INT类型的原因。浮点数类型存在精度问题,而定点数类型DECIMAL则可以精确表示。对于文本类型,TEXT类型最为灵活方便,但不允许做主键。在日期时间类型中,DATETIME类型被推荐使用,因为它包括了完整的日期和时间信息,使用起来比较方便。此外,文章还介绍了一些SQL语句和给出了一些建议,如在定义数据类型时,确定是整数就用INT,小数就用DECIMAL,字符串就用TEXT,日期与时间就用DATETIME。最后,读者被提出了一个思考题,邀请他们分享对于会员信息字段数据类型的选择和原因。整体而言,本文为读者提供了关于MySQL数据类型选择的重要原则和建议,帮助他们在实际项目中做出合适的选择。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《MySQL 必知必会》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(36)

  • 最新
  • 精选
  • cheriston
    置顶
    老师 按照你的代码插入数据 报错啊: [Err] 1366 - Incorrect string value: '\xE4\xB9\xA6' for column 'goodsname' at row 1 好像是字符集问题,为什么,怎么改。

    作者回复: 可能是表的字符集不对,我用的是默认的:CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci,你可以试一下

    2021-04-21
    4
    2
  • 朱晓峰
    置顶
    你好,我是朱晓峰,下面我就来公布一下上节课思考题的答案: 上节课,我们学习了数据存储的完整过程,包括创建数据库、数据表、确认字段和插入数据。下面是思考题的答案:   设计销售表如下:   CREATE TABLE demo.sales (          goodsname text,          salesprice decimal(10,2),          quantity decimal(10,3),          salesvalue decimal(10,2) );

    作者回复: 供大家参考

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

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

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

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

    2021-03-12
    11
  • lesserror
    今天的MySQL查漏补缺来了。虽然MySQL的数据类型就那么几种,但是在实际的项目中还是有很多人在定义表字段的时候选择了不合适的数据类型,导致后期维护成本增加。 例如文中说的,在对精度有要求的字段中没有使用DECIMAL数据类型,反而选用了FLOAT、DOUBLE数据类型。我经手过的很多老项目也喜欢用INT类型来存时间戳,这种时间存取方式很麻烦而且也不直观。我个人也是持和老师相同的观点,采用DATETIME类型来存时间字段。因为虽然 DATETIME 类型占用的存储空间最多,但是它表达的时间最为完整,取值范围也最大。 另外,关于小数点精度丢失的那部分内容,老师解释的很准确。

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

    2021-03-11
    9
  • 海明
    朱老师,我看上面有个例子是这样写的,但是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
    3
    5
  • 青鸟飞鱼
    老师,blob的运用场景是什么呢?

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

    2021-03-11
    4
  • SharpBB
    1.整数类型 TINYINT多用于布尔类型 枚举类型 占1个字节 一般来讲INT用的最多 占4个字节 除非该数字有可能超过21亿 一般不用BIGINT 不要为了节省一点存储空间 而忽视数据溢出带来的风险 可靠性第一! 2.浮点数类型和定点数类型 浮点数 float 单精度浮点数 double 双精度浮点数 mysql默认使用 缺陷:浮点数不精准 二进制无法精确表达 所以只能四舍五入 定点数 decimal可以精确表达 把十进制的整数与小数拆分 用十六进制存储 decimal(5,2) 前面的5是长度 后面的2是保留几位小数 涉及小数 可以无脑用decimal ps:涉及金额的 也可以以分为单位 用整型来存储 3.文本类型 一般都可无脑用text 65535字符 如果过长 则使用longtext text类型无需提前定义长度 且按实际长度存储 varchar(M)需要定义长度 但也是按实际长度存储的 注意 这里的M指的是字符 所以不管是英文还是中文 都可容纳M个 但text类型不能作为主键 这时候可以选择varchar或char 4.日期与时间类型 尽量使用datetime类型 用的最多 最完整 5.总结 整数用int 小数用decimal 字符串用text/varchar 时间用datetime 导图复制的 可能排版不太好

    作者回复: 是的

    2022-02-08
    3
  • NARUTO
    对于跨国的大型系统,时间字段可能会有时区的影响,不同的区域的用户使用时,都希望看到本地的时间,统计报表数据也是类似,这种场景下的时间业务字段,老师建议是用什么类型比较好?理由是什么呢?

    作者回复: 建议使用DATETIME类型,理由是MySQL不会因为不同时区而返回不同的时间值,容易控制。

    2021-09-01
    3
  • 为什么浮点数无符号取值范围的右边界也是个范围呢,

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

    2021-03-11
    2
    3
收起评论
显示
设置
留言
36
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部