• MySQL学习笔记(二):MySQL数据类型汇总及选择参考


    本文主要介绍了MySQL 的常用数据类型,以及实际应用时如何选择合适的类型。

     ******几个通用的简单原则*******

    1. 更小的通常更好。但是要确保没有低估需要存储的值的范围,如果无法确定哪个数据类型是最好的,就选择不会超出范围的最小类型。

    2. 简单就好。优先选择MySQL内建的类型而不是字符串来存储日期,时间。

    3. 尽量避免NULL。可为NULL的列会使得索引的优化比较复杂。

    ***********************************************

    一:数值类型(标亮的为MySQL 扩展的)

    几个需要注意的使用细节:

            1. int 可指定宽度,如int(5), 不指定默认为int(11)。注意,这对大多数应用是没意义的,他不会限制类型合法的范围,仅仅是规定了MySQL的一些交互工具显示字符的个数。

            2. 在插入NULL到一个AUTO_INCREMENT列时,MySQL插入一个比该列最大值大1的值,一个表中最多只能有一个AUTO_INCREMENT列。对于任何想要使用AUTO_INCREMENT的列,应该定义为NOT NULL,并定义为PRIMARY KEY或定义为UNIQUE键

            3. 对于小数的表示,MySQL分为两种方式:浮点数和定点数。浮点数包括float(单精度)和double(双精度),而定点数则只有decimal一种表示。定点数在MySQL内部以字符串形式存放,是在MySQL服务器内部实现的,一方面比浮点数更精确,适合用来表示货币等精度高的数据,另一方面,不如CPU原生的浮点型运算快。

            4.浮点数和定点数都能用(M,D)限定位数,但浮点数后面跟“(M,D)”的用法是非标准用法,如果要用于数据库的迁移,则最好不要这么使用

            5. float和double使用系统默认值限定位数,decimal默认(10,0)

            6.数据插入bit类型字段时,首先转换为二进制,如果位数允许,将成功插入;如果位数小于实际定义的位数,则插入失败,查看时需用bin(name)或者hex(name)查看,否则会显示空

      数值型总结:(1)整型:优先考虑符合存储范围的最小类型。

                        (2)小数:对精度要求不是特别高,选择浮点型,否则定点型。不指定小数点位数。

    二:时间日期类型

    几个需要注意的使用细节:

            1. 注意表示的时间区间,各类型使用区别: 年月日(date 默认 NULL), 年月日时分秒(datetime 默认 NULL),时分秒(time 默认 NULL),经常插入当前时间(timestamp 默认 CURRENT_TIMESTAMP),

               年份(year 默认 NULL).

            2. datetime和timestamp区别:

    (1)TIMESTAMP支持的时间范围较小,其取值范围从19700101080001到2038年的某个时间,而DATETIME是从1000-01-01 00:00:00到9999-12-31 23:59:59,范围更大。
    (2)表中的第一个TIMESTAMP列自动设置为系统时间。 如果在一个TIMESTAMP列中插入NULL,则该列值将自动设置为当前的日期和时间。在插入或更新一行但不明确给TIMESTAMP列赋值时也会自动设置该列的值为当前的日期和时间,当插入的值超出取值范围时,MySQL认为该值溢出,使用“0000-00-00 00:00:00”进行填补。
    (3)TIMESTAMP的插入和查询都受当地时区的影响,更能反应出实际的日期。而DATETIME则只能反应出插入时当地的时区,其他时区的人查看数据必然会有误差。
    (4)TIMESTAMP的属性受MySQL版本和服务器SQLMode的影响很大,本章都是以MySQL5.0为例进行介绍,在不同的版本下可以参考相应的MySQL帮助文档。

     时间型总结:优先考虑TIMESTAMP

    三:字符串类型

    几个需要注意的使用细节:

    1. char 和 varchar: char是固定长度的字符串类型,达不到指定长度会在末尾补空格,这既是优点又是缺点,优点是这也意味着它的处理速度一般较快,但反过来,固定长度就意味着可能会浪费存储空间。varchar会额外使用1-2个字节保存字符的位数。char适合长度比较一只固定或者很短的情况。MyISAM和MEMORY引擎建议使用char,memory引擎把char和varchar同等对待,都当做char处理,而InnoDB建议使用varchar,因为它内部存储都是使用指向数据列值的头指针,所以char不一定就比varchar会处理的快,但char的存储浪费是肯定比不上varchar的。

    2.TEXT 和 BLOB: 一般用于较大文本的保存,两者最主要的差别,BLOB能保存二进制数据,比如图片,而TEXT只能保存字符信息。由于保存大文本,所以会引起一些性能问题,尤其是执行大量的删除操作后,建议定期用 optimize table 进行碎片清理。 可以使用合成的索引提高精确查询的性能,例如建表时多加一列用于保存大文本的散列值,如md5。模糊查询用前缀索引。

     字符型总结:数据长度一致并且固定,例如Hash值,或者数据很短,选择char,否则varchar。

  • 相关阅读:
    解决configure: error: C preprocessor "/lib/cpp" fails sanity check
    centos7.3(1611) 64位 离线安装gcc
    spring-boot 启动时候 出现异常:The bean 'xxx' could not be injected as a 'xx.xxxx' because it is a JDK dynami
    springboot 关于 Class path contains multiple SLF4J bindings.警告的解决
    统计学习方法笔记---1203、统计学习方法总结(3.学习策略、4.学习算法)
    统计学习方法笔记---1202、统计学习方法总结(1.适用问题、2.模型)
    统计学习方法笔记---1201、统计学习方法总结
    统计学习方法笔记---0、读大纲
    心得体悟帖---201204(consciousness)
    心得体悟帖---201204(interest)
  • 原文地址:https://www.cnblogs.com/zhanht/p/5404635.html
Copyright © 2020-2023  润新知