一:数据类型选择标准

  - 更小的通常更好

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

    - 最小的数据类型通常更快,因为他们占用更少的磁盘/内存/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. 浅谈 CSS 预处理器: 为什么要使用预处理器?

    CSS 自诞生以来,基本语法和核心机制一直没有本质上的变化,它的发展几乎全是表现力层面上的提升.最开始 CSS 在网页中的作用只是辅助性的装饰,轻便易学是最大的需求:然而如今网站的复杂度已经不可同日而 ...

  2. 小米Pro 安装苹果系统

    参考 http://www.miui.com/thread-11363672-1-1.html http://www.miui.com/thread-7601066-1-1.html https:// ...

  3. RabbitMQ 学习专栏

    RabbitMQ 官网:http://www.rabbitmq.com/ 原创博文 1.揭开消息中间件RabbitMQ的神秘面纱 2. RabbitMQ 服务器之下载安装 3. RabbitMQ 之修 ...

  4. Windows下pip安装及更新出现“UnicodeEncodeError: 'ascii' codec can't encode character u'\u258c' in position 8: ordinal not in range(128)”问题解决办法

    Windows下pip安装及更新出现“UnicodeEncodeError: 'ascii' codec can't encode character u'\u258c' in position 8: ...

  5. JTable动态刷新数据

    http://www.cnblogs.com/fnlingnzb-learner/p/6025408.html 注意下面几个方法的应用场景,不限于JTable,其他swing组件一样 ———————— ...

  6. 写在开始前---web异常处理

    分层项目中,有上层调用下层,每一层都可能出错,比如数据库连接,文件读写等异常.除了运行时程序的异常,还有业务逻辑的一些问题.发生异常需要做一定处理,既要让开发人员便于排查问题,又要让用户看到友好又便于 ...

  7. 三、Sql Server 基础培训《进度3-是否使用外键(知识点学习)》

    学习作业3: 问题1:你觉得外键有哪些适用情况?哪些不适用情况?   问题2:本次实战案例,由你来架构,你觉得有必要建立外键吗? 说明你的理由?     ======================= ...

  8. chrome 浏览器之下载管理器插件

    chrome默认下载器实在是不招人待见,下面插件是一个非常不错的选择: 名称:Chrono下载管理器 插件地址:https://chrome.google.com/webstore/detail/ch ...

  9. [原] MyBatis 整理

    花了一上午的时间,先整理一个脑图.

  10. python set和get实现

    import math class Square: # 正方形 def __init__(self, l): self.length = l # 边长 def __setattr__(self, ke ...