一:数据类型选择标准

  - 更小的通常更好

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

    - 最小的数据类型通常更快,因为他们占用更少的磁盘/内存/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. CentOS 7.5 安装KVM虚拟机(Windows)

    一.KVM环境搭建1.检测系统是否支持cat /proc/cpuinfo | egrep 'vmx|svm' KVM是基于x86虚拟化扩展(Intel VT 或者 AMD-V)技术的虚拟机软件,所以查 ...

  2. Linux下源码安装xz的方法

    xz是一个不太常见但又效率非常高的解压缩软件,安装方法如下 ,cd /usr/local/src ,wget https://tukaani.org/xz/xz-5.2.3.tar.gz //下载到/ ...

  3. FFmpeg中的时间基(time_base), AV_TIME_BASE

    AV_TIME_BASE 经常在FFmpeg的代码中看到一个奇怪的单位 AV_TIME_BASE ,比如 AVFormatContext 结构体中就有这样一个字段: duration ,它在FFmpe ...

  4. ios 适配iOS11&iPhoneX的一些坑

    前阵子项目开发忙成狗,就一直没做iOS11的适配,直到XcodeGM版发布后,我胸有成竹的在iPhoneX上跑起项目,整个人都凉透了...下面总结一下我遇到的坑,不是很全面,日后补充. 导航栏 导航栏 ...

  5. CentOS 7下PXE+Kickstart无人值守安装操作系统

    1.简介 1.1. 什么是PXE PXE(Pre-boot Execution Environment,预启动执行环境)是由Intel公司开发的最新技术,工作于Client/Server的网络模式,支 ...

  6. [Linux性能调优] 磁盘I/O队列调度策略

    这两天的一个小任务是MongoDB服务器的调优,恰好这段时间对Linux的各种性能诊断.调优感兴趣,就顺着这个任务多翻了些书和文章. 新学到的一个东西是 Linux磁盘的I/O队列调度策略,至少MyS ...

  7. C语言 · 还款计算

    标题: 还款计算 银行贷款的等额本息还款方法是: 每月还固定的金额,在约定的期数内正好还完(最后一个月可能会有微小的零头出入). 比如说小明在银行贷款1万元.贷款年化利率为5%,贷款期限为24个月. ...

  8. 04Hadoop中的setPartitionerClass/SortComparator/GroupingComparator问题

    map阶段 1. 使用job.setInputFormatClass(TextInputFormat)做为输入格式.注意输出应该符合自定义Map中定义的输出. 2. 进入Mapper的map()方法, ...

  9. 新内容转入github

    所有新内容已经转入 https://github.com/honggzb/Study-General https://github.com/honggzb/Study2016

  10. linux java 安装

    对于java的开发,有openJDK 和 orcale jdk两种,大多数的linux 系统都会内置openjdk的安装包,但是大多数java项目的开发都是基于orcale jdk的,所以安装orca ...