MySQL建表数据类型的选择

栏目: 数据库 · 发布时间: 6年前

内容简介:本文永久更新链接地址:

首先数据选择有几个简单原则:

  • 更小的通常更好。 一般情况下,应该尽量使用可以正确存储数据的最小数据类型。例如只需要存 0~200,tinyint unsigned 更好。更小的数据类型通常更快,因为它们占用更少的磁盘、内存和 CPU 缓存,并且处理时需要的 CPU 周期也更少。
  • 简单就好。 简单数据类型的操作通常需要更少的 CPU 周期。例如,整型比字符操作代价更低,因为字符集和校对规则(排序规则)使字符比较 比 整型比较更复杂。这里有两个例子:一个是应该使用 MySQL 内建的类型(date, time, datatime)而不是字符串来存储日期和时间,另一个是应该用无符号整型存储 IP 地址。
  • 尽量避免NULL。 通常情况下最好指定列为 NOT NULL,除非真的需要存储 NULL 值。如果查询中包含可为 NULL 的列,对 MySQL 来说更难优化,因为可为 NULL 的列使得索引、索引统计和值比较都更复杂。特别是计划在列上建索引,就应该尽量避免设计成可为 NULL 的列。

整数类型:(tinyint,smallint,mediumint,int,bigint)

存储(字节) 存储(位) 有符号范围 无符号范围
TINYINT 1 8 -128 ~127 0~255
SMALLINT 2 16 -32768~32767 0~65535
MEDIUMINT 3 24 -8388608~8388607 0~16777215
INT 4 32 -2147483648~2147483647 0~4294967295
BIGINT 8 64 -2^63~2^63-1 0~2^64-1
  • 整数类型有可选的 unsigned 属性,表示不允许负值,这大致可以使正数的上限提高一倍。主键自增 id 适合设置为 unsigned 属性的 int 类型。
  • MySQL 可以为整数类型指定宽度,例如 int(11),对大多数应用这是没有意义的:它不会限制值的合法范围,只是规定了 MySQL 的一些交互工具(例如 MySQL 命令行客户端)用来显示字符的个数。对于存储和计算来说,int(1) 和 int(20) 是相同的。

实数类型:(float,double,decimal)

  • float,double 属于浮点类型(近似值)。decimal 属于定点类型(精确值)。
  • MySQL 浮点型和定点型可以用类型名称后加(M,D)来表示,M 表示该值的总共长度,D 表示小数点后面的长度。
  • float 使用 4 个字节存储;double 使用使用 8 个字节存储;decimal 则是将数字打包保存到一个二进制字符串中(每 4 个字节存 9 个数字) 。例如,decimal(18, 9) 小数点两边将各存储 9 个数字,一共使用 9 个字节:小数点前的数字用 4 个字节,小数点后的数字用 4 个字节,小数点本身占 1 个字节。
  • 因为需要额外的空间和计算开销,所以应该尽量只在对小数进行精确计算时才使用 decimal——例如 存储财务数据 。但在数据量比较大的时候,可以考虑使用 bigint 代替 decimal ,将需要存储的货币单位根据最小的位数乘以相应的倍数即可。

字符串类型:

varchar 和 char 类型

  • varchar 类型用于存储可变长字符串,是最常见的字符串数据类型。
  • varchar 需要使用 1 或 2 个额外字节记录字符串长度:如果列的最大长度小于或等于 255 字节,则只使用 1 个字节表示,否则使用 2 个字节。
  • char 类型是定长的:MySQL 总是根据定义的字符串长度分配足够的空间。
  • char 存储会删除存储数据的末尾空格;varchar 不会。(准确来说是 MySQL 4.1 以后的版本 varchar 不会删除存储数据的末尾空格)

blob 和 text 类型

  • blob 和 text 都是为了存储很大的数据而设计的字符串数据类型,分别采用二进制和字符方式存储。
  • 与其它类型不同,MySQL 把每个 blob 和 text 值当作一个独立的对象处理。
  • blob 和 text 家族之间仅有的不同是 blob 类型存储的是二进制数据,没有 排序 规则或字符集,而 text 类型有字符集和排序规则。
  • memory 引擎不支持 blob 和 text 类型。

枚举(enum)类型

  • MySQL 在内部会将每个值在列表中的位置 保存为整数 ,并且在表的 .frm 文件中保存 “数字-字符串” 映射关系的 “查找表”。
  • 如果使用数字作为枚举常量,这种双重性很容易导致混乱,例如 enum('1', '2', '3') 。建议尽量避免这么做。
  • 枚举字段是按照内部存储的整数而不是定义的字符串进行排序的。

日期和时间类型:

  • MySQL 能存储的最小时间粒度为秒。
  • datetime 保存范围从 1001 年到 9999 年,精度为秒。与时区无关。使用 8 字节的存储空间。
  • timestamp 类型保存了从 1970 年 1 月 1 日 午夜(格林尼治标准时间)以来的秒数,它和 unix 时间戳相同。使用 4 字节的存储空间,范围从 1970 年到 2038 年。与时区有关。
  • MySQL 4.1 以及更新的版本按照 datetime 的方式格式化 timestamp 的值,这仅仅是显示格式上的区别,timestamp 的存储格式在各个版本都是一样的。
  • 除了特殊行为之外,通常也应该尽量使用 timestamp ,因为它比 datetime 空间效率更高。有时候人们会将 unix 时间戳存储为整数值,但这不会带来任何收益。用整数保存时间戳的格式通常不方便处理,所以我们不推荐这么做。(对于这点很多公司项目中是用整数存储,我也查了资料,使用整数的理由一般是日期比较,计算时整数更好处理)

Linux公社的RSS地址https://www.linuxidc.com/rssFeed.aspx

本文永久更新链接地址: https://www.linuxidc.com/Linux/2018-11/155370.htm


以上所述就是小编给大家介绍的《MySQL建表数据类型的选择》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

密码朋克

密码朋克

[澳] 朱利安·阿桑奇 / Gavroche / 中信出版社 / 2017-10 / 42.00元

互联网已经在世界各地掀起了革命,然而全面的打击也正在展开。随着整个社会向互联网迁移,大规模监控计划也正在向全球部署。我们的文明已经来到一个十字路口。道路的一边通往一个承诺“弱者要隐私,强 者要透明”的未来,而另一边则通往一个极权的互联网,在那里,全人类的权力被转移给不受问责的间谍机构综合体及其跨国公司盟友。 密码朋克是一群倡导大规模使用强密码术以保护我们的基本自由免遭攻击的活动家。维基解密的......一起来看看 《密码朋克》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

URL 编码/解码
URL 编码/解码

URL 编码/解码

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试