1、为表中的字段选择合适的数据类型

  • 当一个列可以选择多种数据类型时,应该优先考虑数字类型,其次是日期或二进制类型,最后是字符类型。

  • 对于相同级别的数据类型,应该优先选择占用空间小的数据类型。

2、如何选择正确的整数类型

类型 大小 范围(SIGNED) 范围(UNSIGNED) 用途
TINYINT 1 字节 (-128,127) (0,255) 小整数值,如年龄
SMALLINT 2 字节 (-32768,32 767) (0,65535) 大整数值
MEDIUMINT 3 字节 (-8388608,8388607) (0,16777 215) 大整数值
INT 4 字节 (-2147483648,2147483647) (0,4294967295) 大整数值
BIGINT 8 字节 (-9233372036854775808,9223372036854775807) (0,18446744073709551615) 极大整数值

3、如何选择正确的实数类型

列类型 存储空间 是否精确
FLOAT 4个字节
DOUBLE 8个字节
DECIMAL(与金额有关的) 每4个字节存9个数字,小数点占一个字节
  • DECIMAL(18,9):表示该字段可存储数字最大的长度是18位,其中小数位最大的长度是9位。由于DECIMAL每4个字节存9个数字,小数点占一个字节,所以该字段占9个字节。

4、如何选择VARCHAR和CHAR类型

  • VARCHAR和CHAR类型长度是以字符为定位的而不是字节,如UTF-8编码,每个字符占3个字节,那么CHAR(10)就需要占30个字节

  • VARCHAR类型的存储特点

    • VARCHAR用于存储变长字符串,只占用必要的存储空间。

    • 当列的最大长度小于255时,只占用一个额外字节用于记录字符串长度。

    • 当列的最大长度大于255,则需要占用两个额外字节用于记录字符串长度。

  • VARCHAR长度选择问题

    • 使用最小的符合需求的长度。

    • 系统上线后尽量不要修改VARCHAR的长度,因为在mysql 5.7之前,只要一修改就会发生锁表。

    • VARCHAR(5)和VARCHAR(200)存储'AAAAA'这一个字符串时都是使用一个额外的字节来记录字符串的长度,那么他们的性能有什么不同呢?

      • VARCHAR(5)优于VARCHAR(200)

      • 因为MySQL为了能够更有效的优化查询,对于VARCHAR字段使用的是其最大的宽度来分配内存,所以如果我们把宽度定的太长就会消耗更多的内存。

  • VARCHAR类型的适用场景

    • 字符串列的最大长度比平均长度大很多

    • 字符串列很少被更新

    • 使用了多字节字符集存储字符串(如utf8中的中文和英文)

  • CHAR类型的存储特点

    • CHAR类型是定长的

    • 字符串存储在CHAR类型的列中会删除末尾的空格(VARCHAR则不会)

    • CHAR类型的最大宽度是255个字符,所以如果当我们长度超过255时,则需要使用VARCHAR类型进行存储

  • CHAR类型的适用场景

    • 存储长度近似的值(md5值,如密码)

    • 存储短字符串

    • 存储经常被更新的字符串列

5、如何选择日期类型

  • DATATIME类型

    • 以yyyy-MM-dd HH:mm:ss[.fraction]格式存储日期时间

      • DATATIME = yyyy-MM-dd HH:mm:ss
      • DATATIME(6) = yyyy-MM-dd HH:mm:ss.fraction
    • 与时区无关,占8个字节的存储空间

    • 时间范围:1000-1-1 00:00:00至9999-12-31 23:59:59

  • TIMESTAMP类型

    • 存储了由格林尼治时间1970-1-1 00:00:00到当前时间的秒数,以yyyy-MM-dd HH:mm:ss[.fraction]的格式显示,占用4个字节

    • 时间范围:1970-1-1 到 2038-01-19

    • 显示依赖于所指定的时区

    • 在行的数据修改时可以自动修改TIMESTAMP列的值(设置为NOT NULL即可),默认是第一个为TIMESTAMP类型的列才会自动更新

  • DATE类型(如生日)

    • 占用3个字节

    • 使用DATE类型可以利用日期函数进行日期之间的计算

    • 范围:1000-01-01到9999-12-31

  • TIME类型

    • HH:MM:SS
  • 注意事项:

    • 不要使用字符串类型存储日期时间数据

      • 日期时间类型通常比字符串占用空间小

      • 日期类型在进行查找过滤时可以利用日期来进行对比

      • 可以利用日期函数进行日期之间的计算

    • 使用Int存储日期时间不如使用TIMESTAMP类型

      • 因为TIMESTAMP类型底层其实也是使用INT来存储的,只不过显示的时候格式化了而已,但更方便查看

MYSQL建表时数据类型的选择相关推荐

  1. MySQL中级优化教程(五)——数据库建表时数据类型的选择

    您可以到这里下载本篇博文所使用的数据库以及优化工具mysqldumpslow和pt-query-digest: https://blog.csdn.net/IT_TIfarmer/article/de ...

  2. mysql建表时数据类型解释_关于数据库建表时字段数据类型

    基础: char.varchar.text和nchar.nvarchar.ntext的区别 1.CHAR.CHAR存储定长数据很方便,CHAR字段上的索引效率级高,比如定义char(10),那么不论你 ...

  3. mysql建表时主键_mysql建表时设置主键的方法

    mysql建表时设置主键的方法 发布时间:2020-10-10 15:17:28 来源:亿速云 阅读:119 作者:小新 mysql建表时设置主键的方法?这个问题可能是我们日常学习或工作经常见到的.希 ...

  4. 设计数据库表时数据类型的选择

    设计数据库表时数据类型的选择 1. 整数类型 整数类型有:tinyint.smallint.mediumint.int.bigint,分别使用 8.16.24.32.64 位存储空间. 它们可以存储的 ...

  5. mysql建表时错误1075_navicat出现错误1075怎么办

    MYSQL中AUTO_INCREMENT会在新记录插入表中时生成一个唯一的数字.希望在每次插入新记录时,自动地创建主键字段的值,可以在表中创建一个 auto-increment 字段. mysql创建 ...

  6. mysql 建表时创建唯一索引

    Mysql建表与索引使用规范整理 一,设计表规范: MySQL建表,字段需设置为非空,需设置字段默认值: MySQL建表,字段需NULL时,需设置字段默认值,默认值不为NULL: MySQL建表,如果 ...

  7. mysql 建表时建立索引_mysql 分享建表和索引的几点规范

    一. MySQL建表,字段需设置为非空,需设置字段默认值. 二. MySQL建表,字段需NULL时,需设置字段默认值,默认值不为NULL. 三. MySQL建表,如果字段等价于外键,应在该字段加索引. ...

  8. Python3 使用 pymysql 连接 MySQL 建表时出现 Warning3719 UTF8 警告

    在学习 Python3 爬虫关系型数据库储存时,利用 pymysql 连接 MySQL 建表,测试用的代码如下,第一句 SQL 用于获取当前 MySQL 的版本信息,第二句 SQL 执行创建 spid ...

  9. mysql建表时主键_mysql建表时怎么设置主键?

    设置方法:在"CREATE TABLE"语句中,通过"PRIMARY KEY"关键字来指定主键,语法格式"字段名 数据类型 PRIMARY KEY [ ...

最新文章

  1. Java线上程序频繁JVM FGC问题排障与启示
  2. 重置忘记的mysql root密码
  3. Google AI 骗过了 Google,工程师竟无计可施?
  4. 怎么做c语言的子程序,哪位师傅知道51单片机怎样编写子程序?C语言的。在主程序里调...
  5. C/C++中字符串切割(split)
  6. SQL 从入门到精通
  7. c#和java工资相差多少岁_为什么C#程序员平均工资水平比Java程序员低?
  8. 基于uA741 PWM发生器
  9. ubuntu 虚拟机设置全屏
  10. 《四》大话 TypeScript 泛型
  11. laravel mysql 时区_Laravel时区设置
  12. Vulkan教程翻译之六 创建 Swapchain
  13. 文化袁探索专栏——Activity|Application启动流程
  14. 荣耀20手机不升级鸿蒙经验
  15. 【C++系列15】c++的正无穷和负无穷
  16. cad角度命令怎么输入_新手入门,学习CAD必须掌握,教你使用标注命令,绘图效率翻一倍...
  17. 微信小程序语音聊天智能对话(demo)
  18. 张小龙2011年饭否日记
  19. 什么是脚本语言,shell脚本又是什么?
  20. Altium Designer 18 音频均衡器电路 层次化原理图设计修改点归类

热门文章

  1. 定了!华为P30/P30 Pro正式官宣:3月26日见
  2. 利润太薄甚至亏损?小米卢伟冰解释红米Note7线下缺货问题
  3. python数值类型的操作_Python学习笔记,数值类型及操作
  4. 程序员打字练习_程序员必须来看的面试圣经!!
  5. java------用File类列出一个目录下的所有文件夹和文件
  6. 【Flink】 Flink 源码之 SQL 执行流程
  7. 95-910-144-源码-FlinkSQL-Flink的UDF
  8. 【ElasticSearch】Es 源码之 LicenseService 源码解读
  9. 【ElasticSearch】Es 源码之 PersistedClusterStateService 源码解读
  10. 【ambari】Ambari 环境安装