设为首页 收藏本站
查看: 1106|回复: 0

[经验分享] MySQL学习笔记(二):MySQL数据类型汇总及选择参考

[复制链接]

尚未签到

发表于 2018-10-9 06:27:34 | 显示全部楼层 |阅读模式
  本文主要介绍了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。


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-617857-1-1.html 上篇帖子: MySQL学习笔记(三):常用函数 下篇帖子: MySQL学习笔记(一):SQL基础
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表