一:数据类型选择标准

  - 更小的通常更好

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

    - 最小的数据类型通常更快,因为他们占用更少的磁盘/内存/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. 【C++】C++中类的基本使用

    1.类和成员声明,定义,初始化的基本规则 C++中类的基本模板如下: namespace 空间命名{//可以定义namespace,也可以不定义 class/struct 类名称{ public/pr ...

  2. TensorFlow+Keras 02 深度学习的原理

    1 神经传递的原理 人类的神经元传递及其作用: 这里有几个关键概念: 树突 - 接受信息 轴突 - 输出信息 突触 - 传递信息 将其延伸到神经元中,示意图如下: 将上图整理成数学公式,则有 y = ...

  3. 面经 cisco

    1. 优先级反转问题及解决方法 (1)什么是优先级反转 简单从字面上来说,就是低优先级的任务先于高优先级的任务执行了,优先级搞反了.那在什么情况下会生这种情况呢? 假设三个任务准备执行,A,B,C,优 ...

  4. 星云STS 常用配置

    STS4  下载地址:https://spring.io/tools    (这个版本没有tomcat插件) STS3  下载地址:https://spring.io/tools3/sts/all ( ...

  5. 【原创 Hadoop&Spark 动手实践 5】Spark 基础入门,集群搭建以及Spark Shell

    Spark 基础入门,集群搭建以及Spark Shell 主要借助Spark基础的PPT,再加上实际的动手操作来加强概念的理解和实践. Spark 安装部署 理论已经了解的差不多了,接下来是实际动手实 ...

  6. 【Java基础】Java注解简单入门

    注解简单来说就是配置,是特别的配置,之前常用的配置文件,可以用注解替换.然后通过反射去获取注解的信息. 如何定义一个注解 你在IDE中新建一个注解定义,是这样的结构的: package com.nic ...

  7. 常用xpath选择器和css选择器总结

    xpath选择器 表达式 说明 article 选取所有article元素的所有子节点 /article 选取根元素article article/a 选取所有属于article的子元素的a元素 // ...

  8. mysql插入报主键冲突,解决方法主键索引重新排序

    1.备份表结构 create table table_bak like table_name; 2.备份表数据 insert into table_bak select * from table_na ...

  9. 再杀掉app之后 删除NSUserDefault存在本地的数据

    这两天在处理  app退出后删除本地数据  在appDelegate里的这个函数里设置发现进不去 - (void)applicationWillTerminate:(UIApplication*)ap ...

  10. LiveSwitch白皮书

    https://www.frozenmountain.com/media/1224/frozen-mountain-software-liveswitch-white-paper.pdf —————— ...