Mysql版本众多,每个版本支持的数据类型繁多且不一样,本篇文章中主要基于MySQL Community Server 5.7.22介绍常用的数据类型,包括其特点以及区别。

一.数据类型

正确的定义表结构:数据类型、字段长度,对于数据库性能至关重要。Mysql中支持众多数据类型,很多类型又支持不同的长度。

从以上的图中可以看出在Mysql中主要支持三种大类型的数据:

  • Numeric数值类型
  • Date and Time日期时间类型
  • String字符串类型

其中每种大类型中又细分特定的数据类型

Numeric Date and Time String
TINYINT DATE CHAR
SMALLINT DATETIME VARCHAR
INT TIMESTAMP BLOB
MEDIUMINT TIME TEXT
BIGINT YERA ENUM
FLOAT
DOUBLE
DECIMAL

二.区别及应用场景

1.Numeric

数值类型的细分标准主要是根据数值表示的精度划分,其中整形又根据表示范围进一步划分。

  1. 精度划分:整形、单精度浮点类型、双精度浮点类型、DECIMAL
  2. 范围划分:TINYINT、SMALLINT、MEDIUMINT、BIGINT

下表中表示了各种INT类型的范围和存储所需要的字节长度:

根据上表,对于表结构的列字段数据类型选型一定要精确匹配,能够节省存储空间,体现设计的严谨。比如订单状态,可以使用TINYINT类型。

DECIMAL-Fixed-Point Types (Exact Value):当需要明确表示数值精度时,就需要使用DECIMAL,比如货币数据,金钱是无法四舍五入近似处理的数据。比如薪资,存款。

FlOAT/DOUBLE-Floating-Point Types (Approximate Value):浮点类型大多数用于近似处理场景。

Type Storage(Bytes) Precision
FLOAT 4 23
DOUBLE 8 53

2.DATE and TIME

  • DATE表示日期,无时间部分。mysql检索和展示日期使用'YYYY-MM-DD'格式,范围在:'1000-01-01' to '9999-12-31'。
  • DATETIME表示日期时间,既有日期部分又有时间部分。mysql检索和展示日期时间使用'YYYY-MM-DD HH:MM:SS'格式,范围在:'1000-01-01 00:00:00' to '9999-12-31 23:59:59'。
  • TIMESTAMP表示时间戳,既有日期也有时间部分。范围在:1970-01-01 00:00:01' UTC to '2038-01-19 03:14:07' UTC。由此可以看出DATETIME和TIMESTAMP的区别在于时间表示的范围上。除此,mysql在存储TIMESTAMP类型时将TIMESTAMP值从当前时区转换到UTC时区,检索时再将其从UTC转换到当前时区。这个时区设置是基于数据库连接的。默认情况下,每个连接的时区被设置为server端的时区,也可以单独设置连接的时区。所以如果改变连接的时区,检索时获取到的TIMESTAMP将表现不同。
  • TIME表示时间。mysql检索和展示时使用'HH:MM:SS'格式或者HHH:MM:SS,范围在:'-838:59:59' to '838:59:59'。TIME类型不仅可以表示一天中的时间点,还可以表示过去的时间或者间隔的时间段,所以可以是三位H。

3.String

String类型中常用的是CHAR和VARCHAR类型,TEXT和BLOB在大型字段中存储可能会使用,BLOB是存储String的二进制,比如图片二进制字节,TEXT存储文本。枚举在常量列表数据中可能会使用,主要是为了提高性能。

Char和VARCHAR类型十分相似,都是存储字符。但是从底层检索和存储角度分析,表现又不一样,且最大长度和尾部遗留空间是否保留的策略上表现也不尽相同。

比较 描述
相同点 1.都是存储字符类型数据; 2.类型申明时,都指定长度;
不同点 1.表示的长度范围不一。CHAR能表示0-255长度的字符, VARCHAR可以表示0-65535长度; 2.CHAR申明后,存储数据时长度是固定的,长度不足时 从右边补空格。VARCHAR申明后,存储时长度是可变的, VARCHAR最大有效长度取决于行数据的大小和字符集, VARCHAR在存储时有额外的1-2byte长度数据表示, 额外长度的数据表示存储的数据的字节个数; 3.CAHR在检索时,将去除后面的空格;

从以上的不同点描述CHAR和VARCHAR的存储原理中,可以看出CHAR和VARCHAR在底层的存储和检索时大不一样。

在非严格模式下,对于超过列申明长度的CHAR或者VARCHAR,mysql会截取以适合其申明的长度进行存储。例如下表:

参考

MySQL 5.7 Reference Manual
MySQL数据类型DECIMAL用法

Mysql系列(二)—— Mysql支持的数据类型的更多相关文章

  1. Mysql系列二:Mysql 开发标准规范

    原文链接:http://www.cnblogs.com/liulei-LL/p/7729983.html 一.表设计 1. 库名.表名.字段名使用小写字母,“_”分割. 2. 库名.表名.字段名不超过 ...

  2. MySQL系列(二)--MySQL存储引擎

    影响数据库性能的因素: 1.硬件环境:CPU.内存.存盘IO.网卡流量等 2.存储引擎的选择 3.数据库参数配置(影响最大) 4.数据库结构设计和SQL语句 MySQL采用插件式存储引擎,可以自行选择 ...

  3. 一生挚友redo log、binlog《死磕MySQL系列 二》

    系列文章 原来一条select语句在MySQL是这样执行的<死磕MySQL系列 一> 一生挚友redo log.binlog<死磕MySQL系列 二> 前言 咔咔闲谈 上期根据 ...

  4. 基于【 MySql 】二 || mysql详细学习笔记

    mysql重点学习笔记 /* Windows服务 */ -- 启动MySQL net start mysql -- 创建Windows服务 sc create mysql binPath= mysql ...

  5. mysql系列二、mysql内部执行过程

    向MySQL发送一个请求的时候,MySQL到底做了什么 客户端发送一条查询给服务器. 服务器先检查查询缓存,如果命中了缓存,则立刻返回存储在缓存中的结果.否则进入下一阶段. 服务器端进行SQL解析.预 ...

  6. mysql学习二、SQL常用数据类型

    一.常用数据类型 二.选择数据类型的原则: 1 业务需要 2 满足第一个条件下,需要存储空间最小的. 三.常用的选择数据类型思路:

  7. MySQL系列:MySQL的基本使用

    数据库的基本操作 在MySQL数据库中,对于一个MySQL示例,是可以包含多个数据库的. 在连接MySQL后,我们可以通过 show databases; 来进行查看有那么数据库.这里已经存在一些库了 ...

  8. 【MySql系列】MySql踩坑系列

    问题一:远程登录报错Host '192.168.181.201' is not allowed to connect to this MySQL server 解决: 问题二:MySql access ...

  9. BootStrap 智能表单系列 二 BootStrap支持的类型简介

    代码如下(链接地址:https://github.com/xiexingen/Bootstrap-SmartForm/blob/master/demo/form1-basic.html): <! ...

  10. MySQL操作(二)MySQL配置文件

    1.正常安装之后,有安装目录,我的直接安装在默认目录下,即 C:\Program Files\MySQL\MySQL Server 5.7 目录下 而数据存储在 C:\ProgramData\MySQ ...

随机推荐

  1. 源码升级SUSE openssh

    1.check old opensslrpm -q opensslopenssl versionwhich opensslwhereis opensslls /etc/ssl 2.backup old ...

  2. js 数组 添加或删除 元素 splice 创建一个新的数组,新数组中的元素是通过检查指定数组中符合条件的所有元素 filter

    里面可以用 箭头函数 splice         删除 增加 数组 中元素 操作数组 filter 创建新数组  检查指定数组中符合条件的所有元素

  3. 【学习笔记】PYTHON语言程序设计(北理工 嵩天)

    1 Python基本语法元素 1.1 程序设计基本方法 计算机发展历史上最重要的预测法则     摩尔定律:单位面积集成电路上可容纳晶体管数量约2年翻倍 cpu/gpu.内存.硬盘.电子产品价格等都遵 ...

  4. Docker搭建Nexus(Maven私库)

    0.镜像的查找:docker search nexus 1.拉取官方镜像:docker pull sonatype/nexus3 2.创建了自己的目录 (/opt/nexus/nexus-data) ...

  5. 第12节-BLE协议HCI层的数据格式

    学习资料: 1. 蓝牙协议core_v5.0.pdf <Vol 2: Core System Package [BR/EDR Controller volume]>的“Part E: Ho ...

  6. 在windows下安装Superset

    前言 最近想用一下Superset,这个是一个开源项目,可以直接通过写sql来生成图表,有时候对一些图表需求比较多的时候,可以用的上. Superset是由Airbnb(知名在线房屋短租公司)开源BI ...

  7. classpath环境变量解惑

    只有使用低于JDK1.5版本的JDK时,才需要设置classpath环境变量. 因为早期版本的JDK没有设计在当前路径下搜索Java类的功能,而且编译和运行java程序时还需要JDK的lib路径下的d ...

  8. Comet OJ 夏季欢乐赛 完全k叉树

    完全k叉树 https://cometoj.com/contest/59/problem/A?problem_id=2712 题目描述 欢迎报考JWJU!这里有丰富的社团活动,比如为梦想奋斗的ACM集 ...

  9. eclipse scala语法用java检验 报错问题

    传送门 https://stackoverflow.com/questions/8522149/eclipse-not-recognizing-scala-code 还是 直接用eclipse的 sc ...

  10. DCI学习链接及文章

    https://www.jianshu.com/u/c1b1137d5886 李永顺 https://www.jianshu.com/users/7386692d5489/timeline 袁英杰 小 ...