一:数据类型选择标准

  - 更小的通常更好

    - 在没有低估需要存储值的范围时,选择可以正确存储数据的最小数据类型。

    - 最小的数据类型通常更快,因为他们占用更少的磁盘/内存/CPU缓存,并且处理更快。

  - 简单就好

    - 简单的类型通常需要更少的CPU周期。

    - 例如  整型比字符操作代价更低 /  使用Mysql内建类型而不是字符串存储日期。

  - 避免使用 Null

    - Null 使得 Mysql 在 索引/统计/比较 执行优化时,行为更为复杂。

    -  而且需要更多的存储空间去保存Null.

三:整型

  - 常用类型

    • 类型      字节  位  范围        无符号范围-2(N-1)至2(N-1)-1     无符号范围2(N)-1
      TINYINT   1    8   2的8次方    -128 — 127                    0 — 255
      SMALLINT  2    16  2的16次方   -3276 8 — 3276 7              0 — 6553 5
      MEDIUMINT 3    24  2的24次方   -8388608 - 8388607            0 - 1677 7215
      INT       4    32  2的32次方   -2147 4836 46 — 2147 4836 47  0 — 4294 9672 95
      BIGNET    8    64  很大,够用

  - 使用选择

    - 在 整型 的使用上,这些类型在很大程度上是相同的,只有它们存储的值的范围是不相同的。

    - 所以需要根据使用值 范围 来选择 整型类型。

  - 关于整型宽度 (zerofill)

    - MySQL 以一个可选的显示宽度指示器的形式对 SQL 标准进行扩展(如 INT(6),6即是其宽度指示器。

    - 该宽度指示器并不会影响int列存储字段的大小,也就是说,超过6位它不会自动截取,依然会存储,只有超过它本身的存储范围才会截取;此

    - 处宽度指示器的作用在于该字段是否有zerofill,如果有就未满足6位的部分就会用0来填充

    - 注意的是,使用一个宽度指示器不会影响字段的大小和它可以存储的值的范围。

    - 设置一个字段为 zerofill 那么它必然是 unsigned 的。

    • // 创建字段
      mysql> create table `demo` ( `num` tinyint() zerofill);
      Query OK, rows affected (0.03 sec) // 查看字段属性
      mysql> desc demo;
      +----------+------------------------------+------+-----+---------+-------+
      | Field | Type | Null | Key | Default | Extra |
      +----------+------------------------------+------+-----+---------+-------+
      | num | tinyint() unsigned zerofill | YES | | NULL | |
      +----------+------------------------------+------+-----+---------+-------+
      row in set (0.00 sec)

      // 插入数据
      mysql> insert into demo values ();
      Query OK, row affected (0.00 sec) // 查看数据 (宽度补充)
      mysql> select * from demo;
      +------+
      | num |
      +------+
      | |
      +------+

四: 浮点型(如果可以,请尽量使用整数来表示浮点数值)

  - 常用类型

    • 类型                占用(字节)
      FLOAT(M,D)
      DOUBLE(M,D)
      DECIMAL(M, D) M+ 字节 默认为(,) M 表示可以显示多少位数字(数字+小数点)
      D 位于小数点后,又称 精度/标度
        (数据的精度总是能精确到D位,也就是数据的不精确一定出现在小数点后)
        (数据存储的时候只能存储到D位小数)
      超出的位,Mysql会四舍五入进行保存  

  - 使用选择

    - 对于精度准确度要求不高的浮点数存储可以使用 float。

      - float/double 不准确在于,在 Mysql 中,数据精确度取决于分配给数据结构的长度。在按照长度进行二进制转换时候,就会造成数据的不不准确。

      - double 和 float 的区别是 double 精度高,有效数字 16 位,float 精度 7 位。

      - 但 double 消耗内存是 float 的两倍,double 的运算速度比 float 慢得多,

      - SO,能用 float 时不要用 double(以省内存,加快运算速度)。

    - 如果需要存储一个准确的 浮点数 ,使用 DECIMAL。

      - 但是 DECIMAL 存储长度最大为 65.

      - 如果需要更大精度,可以使用 字符串 存储

    - 《MySQL如何选择float, double, decimal》

五:字符串

  - 常用类型

    • 类型            占用(字节)
      char(n) 3 * n
      varchar(n) 3 * 实际
      BLOB
      TEXT

  - 使用场景

    - CHAR

      - CHAR善于存储经常改变的值,或者长度相对固定的值,比如type、ip地址或md5之类的数据,由于 char 定长 不容易产生碎片。

      - 比如CHAR(30)能放30个字符,存放abcd时,尾部会以空格补齐,实际占用空间 30 * 3bytes (utf8)。检索它的时候尾部空格会被去除。

    - VARCHAR

      -  VARCHAR善于存储值的长短不一的列,也是用的最多的一种类型,节省磁盘空间。

    - BLOB(不建议使用)

      - 可以存储二进制,照片等( 会引起一些性能问题)

    - TEXT(不建议使用)

      - 只能保存字符,日记( 会引起一些性能问题)

  - CHAR 和 VARCHAR 的区别

    - 使用对比

      - Char 的最大长度为 0-255 字符,Varchar 收到最大行长度的限制,行最大为 65535 字节。

      - Char 会自动去除行尾空格。(如果字段设置了 unqiue, 那么在空格去除之后,也会引起冲突)

    - 内存对比

      - Char 是固定长度,处理速度会比 Varcahr 快一些,但同时 Char 会浪费存储,程序需要对空格做出处理.

      - Varchar 可变长度,在使用时也需要不要直接给一个大值。因为在Mysql内部分配内存时候,也会根据默认值分配内存。

    - 场景对比

      - 对于长度变化不大,对于查询速度有较高要求的选用 Char, 可变长选用 Varchar.

    - 储存方式对比

      - 《MySQL - 行模式》

六:日期类型

  - 常用类型

    • 类型                保存信息             占用(字节)
      DATE 年月日
      DATETIME 年月日时分秒
      TIME 时分秒
      TIMESTAMP 年月日时分秒
      YEAR 年

  - 使用场景

    - DATE/DATETIME/TIME 由于其存储信息不同,所以根据需要保存内容选择。

      - 由于 TIMESTAMP 支持时间太小(至 2038年), 所以时间存储尽量使用 DATETIME

    - 如果只想保存年份,使用 YEAR    

《Mysql 数据类型》的更多相关文章

  1. 简单物联网:外网访问内网路由器下树莓派Flask服务器

    最近做一个小东西,大概过程就是想在教室,宿舍控制实验室的一些设备. 已经在树莓上搭了一个轻量的flask服务器,在实验室的路由器下,任何设备都是可以访问的:但是有一些限制条件,比如我想在宿舍控制我种花 ...

  2. 利用ssh反向代理以及autossh实现从外网连接内网服务器

    前言 最近遇到这样一个问题,我在实验室架设了一台服务器,给师弟或者小伙伴练习Linux用,然后平时在实验室这边直接连接是没有问题的,都是内网嘛.但是回到宿舍问题出来了,使用校园网的童鞋还是能连接上,使 ...

  3. 外网访问内网Docker容器

    外网访问内网Docker容器 本地安装了Docker容器,只能在局域网内访问,怎样从外网也能访问本地Docker容器? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Docker容器 ...

  4. 外网访问内网SpringBoot

    外网访问内网SpringBoot 本地安装了SpringBoot,只能在局域网内访问,怎样从外网也能访问本地SpringBoot? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装Java 1 ...

  5. 外网访问内网Elasticsearch WEB

    外网访问内网Elasticsearch WEB 本地安装了Elasticsearch,只能在局域网内访问其WEB,怎样从外网也能访问本地Elasticsearch? 本文将介绍具体的实现步骤. 1. ...

  6. 怎样从外网访问内网Rails

    外网访问内网Rails 本地安装了Rails,只能在局域网内访问,怎样从外网也能访问本地Rails? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Rails 默认安装的Rails端口 ...

  7. 怎样从外网访问内网Memcached数据库

    外网访问内网Memcached数据库 本地安装了Memcached数据库,只能在局域网内访问,怎样从外网也能访问本地Memcached数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装 ...

  8. 怎样从外网访问内网CouchDB数据库

    外网访问内网CouchDB数据库 本地安装了CouchDB数据库,只能在局域网内访问,怎样从外网也能访问本地CouchDB数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Cou ...

  9. 怎样从外网访问内网DB2数据库

    外网访问内网DB2数据库 本地安装了DB2数据库,只能在局域网内访问,怎样从外网也能访问本地DB2数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动DB2数据库 默认安装的DB2 ...

  10. 怎样从外网访问内网OpenLDAP数据库

    外网访问内网OpenLDAP数据库 本地安装了OpenLDAP数据库,只能在局域网内访问,怎样从外网也能访问本地OpenLDAP数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动 ...

随机推荐

  1. .NET领域最为流行的IOC框架之一Autofac WebAPI2使用Autofac实现IOC属性注入完美解决方案 AutoFac容器初步

    .NET领域最为流行的IOC框架之一Autofac   一.前言 Autofac是.NET领域最为流行的IOC框架之一,微软的Orchad开源程序使用的就是Autofac,Nopcommerce开源程 ...

  2. Could not resolve all dependencies for configuration ':classpath'

    我这里是copy过来的项目包名没有修改,导致依赖找不到

  3. (7) MySQL数据库备份详解

    对于任何数据库来说,备份都是非常重要的 数据库复制不能取代备份的作用 比如我们由于误操作,在主数据库上删除了一些数据,由于主从复制的时间很短,在发现时,从数据库上的数据可能也已经被删除了, 我们不能使 ...

  4. Gitee vs插件(Gitee Extension for Visual Studio)

    Gitee 码云(gitee.com)是开源中国推出的代码托管平台,支持 Git 和 SVN,提供免费的私有仓库托管. https://gitee.com/GitGroup/Gitee.VisualS ...

  5. VBA二次学习笔记(3)——批量合并单元格

    说明(2018-9-16 22:17:49): 1. 昨天运动会,100米八个人跑了第五,400米五个人跑了第三,得了个榨汁机.终于结束了哈哈哈!之前一个星期紧张的天天拉肚子,真是没出息..不过养成了 ...

  6. HTTP 05 安全

    TCP 打包时加密, 报文传输时 加密 通过证书来判断是否是可以访问的客户端/服务器. 公开秘钥 进行加密, 随便被人知道 私有秘钥 进行解密, 自己保留 http + 加密 + 认证 + 完整性保护 ...

  7. Netty 学习笔记(1)通信原理

    前言 本文主要从 select 和 epoll 系统调用入手,来打开 Netty 的大门,从认识 Netty 的基础原理 —— I/O 多路复用模型开始.   Netty 的通信原理 Netty 底层 ...

  8. org.hibernate.InvalidMappingException: Could not parse mapping document from无法创建sessionFactory

    把 "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd" 改为 "http://hibernate.sourc ...

  9. swoole推送信息一对一,一对多

    服务端 $ws->on('message', function ($ws, $frame) { //echo "接收到的信息: {$frame->data}\n"; / ...

  10. Adas术语简称

    V2X: DSRC:专用短程通信(DSRC)的公用频谱信道交换数据