引言

从第一次学习mysql开始,不知道为什么MySQL的数据类型始终没有像Java 一样深入脑海,对某些数据类型的定义和用法,也并不清晰,这篇文章,就好好总结一番,将MySQL中几个常用的数据类型归纳一下。

一、类型选择的原则

在设计表的时候,首先就是要考虑存储的数据与MySQL的哪种类型相吻合,比如,金额,就要用数字类型,最差也要用字符串类型,日期可以是date 类型,或者也可以是字符串类型,考虑这类问题,其实只需要考虑某个数据类型能否正确的表示将要存储的数据即可。

第二点非常重要原则是:

所选择的类型越简单越好,能保存数值的类型越小越好

这点不难理解,数据类型描述了物理硬件存储数据的方式,简单的类型更快,小的类型更省空间,因此,在选择数据类型的时候就要尽可能的越小越简单越好,避免存储或性能上的浪费。

二、MySQL常见数据类型

与 Java 不同的是,MySQL的数据类型描述的更为抽象化一些。它们总共分为三类:

数值型、字符型、日期型

2.1 数值型

MySQL支持所有标准SQL数值数据类型。数值型可以分为两大类:整数和小数。

2.1.1 整数

整型共有 5 种:

Type Storage (Bytes) Minimum Value Signed Minimum Value Unsigned Maximum Value Signed Maximum Value Unsigned
TINYINT 1 -128 0 127 255
SMALLINT 2 -32768 0 32767 65535
MEDIUMINT 3 -8388608 0 8388607 16777215
INT 4 -2147483648 0 2147483647 4294967295
BIGINT 8 -263 0 263-1 264-1

从官方文档上来看,INTEGER 和 INT 貌似没有什么太大的区别,可以理解为同义词。从MySQL官网中的说明,我们可以得知,SQL标准的整数类型只有 INTEGER(或 INT)和 SMALLINT,而剩下三种,则是MySQL对标准的一种扩展。

符号的定义是值得注意的点,如果不指定 unsigned 关键字,那么默认是有符号类型。如果插入的数据大于整型的范围,那么就会报 out of range 异常,同时插入临界值。

整型一般可以不设置 Length,这个属性代表了该类型的显示长度。

2.1.2 定点数(Fixed-Point)

定点数属于小数的一种,是一种可以存储精确小数的数据类型。

DECIMALNUMERIC

这两个类型用于存储确切精度的数据,例如货币数据,当然,个人认为在不同的场景下,可以采用最小货币单位存储方式,比如,在数据库中以整型存储金额,以分作为单位,并在整个系统中保持统一。

MySQL中,NUMERIC 是用 DECIMAL 来实现的,因此两者在本质上是无区别的。

salary DECIMAL(5, 2)

薪资可以使用上面的方式进行定义,那么它所表示的范围就是:-999.99 到 999.99 。前一个参数是总位数,后一个参数代表小数保留的位数。

另外,还有一种特殊的形式 DECIMAL(M) ,它等同于 DECIMAL(M, 0) ,它的意思是没有小数部分。或者干脆不指定任何参数,如果不指定 M 则默认为 10。

这样定义的字段,如果插入的数据超过了限定范围,那么就会插入临界值

2.1.3 浮点数(Floating-Point)

FLOAT 和 DOUBLE 是两个浮点数类型,前者是单精度占4个字节,后者是双精度占8个字节。它们都是不精确的数据类型。

2.2 字符型

2.2.1 短文本 CHAR 和 VARCHAR

MySQL最常用的字符型是 CHARVARCHAR ,他们有相似处,同时存取却也存在差异。

CHAR和 VARCHAR 都需要指定一个长度,这个长度描述了需要存储的最大字符个数,如CHAR(30) 可以存储最多 30 个字符,注意,所有单个汉字都算一个字符。

CHAR 类型以定长存储,长度的范围可以是 0 到 255 之间任意值。如果存储的字符不够,那么 MySQL会为其自动以空格填补空间,当取出时,又会为其自动去除

VARCHAR 类型以变长存储,而且长度范围可以是 0 到 65535 之间任意值。但其有效最大长度取决于最大行大小以及字符集

Value CHAR(4) Storage Required VARCHAR(4) Storage Required
'' '    ' 4 bytes '' 1 byte
'ab' 'ab  ' 4 bytes 'ab' 3 bytes
'abcd' 'abcd' 4 bytes 'abcd' 5 bytes
'abcdefgh' 'abcd' 4 bytes 'abcd' 5 bytes

2.2.2 长文本 TEXT 和 BLOB

BLOB是一个二进制大对象,可以容纳可变数量的数据,TEXT 可以存储较大的文本。

参考官网:https://dev.mysql.com/doc/refman/5.7/en/blob.html

2.2.3 ENUM 类型

在 MySQL中,枚举类型也属于字符型,枚举的值必须是字符串,不区分大小写。如:

CREATE TABLE enum_t(state ENUM('1', '2', '4')
)

枚举类型非常适合定义一些记录状态变化的字段,比如订单状态,这样,可以极好的提升数据的可维护性。在官方给出的说明中,有如下两方面。

优势:

1、压缩了数据出现的情况,同时,MySQL会自动将存储的字符串编码为数字,即进行了一些优化。

2、可读性的查询和输出。MySQL会结果集中自动将底层存储的数字转化回原来定义的字符串。

需要考虑的问题:

1、enum 类型内部维护着从 1 开始的索引值,每个字符串枚举值都对应着一个正整数序号  1、2、3... ,这也是为什么enum 里的枚举值必须是字符串的原因,而且官方也不建议枚举值的字符串和数字看起来很像,这样很容易和索引值混淆,因为我们同样可以直接使用索引值对字段进行插入操作:

2、对枚举字段使用 order by 子句,会按照索引顺序排序。这和Java 中的枚举排序基本一致(Java 中是按照枚举值定义的位置顺序来默认排序的)。另外,空字符串排在所有非空字符串前面,NULL 排在其他所有值前面。

2.2.4 SET 类型

SET 类型可以保存最多64个成员。与 ENUM 最大的区别在 SET 类型一次可以选取多个成员,而 ENUM 只能选取一个。

存储的值用一个引号包裹起来,每个值中间用逗号隔开注意中间不允许有空格:

''
'one'
'two'
'one,two'

2.3 日期型

参考之前的总结《MySQL日期类型的处理总结》

值得一提的是,日期类型需要用引号(单双都可)引起来,换句话说,我们可以直接将日期类型理解为符合日期格式规范的字符串。在Java 中,我们甚至可以直接以字符串的形式与MySQL进行日期类型的交互而不会有任何问题。

综上,就是关于MySQL常用数据类型的简单总结,参考了尚硅谷的MySQL基础视频,以及MySQL官网对数据类型的解释:

https://dev.mysql.com/doc/refman/5.7/en/data-types.html

MySQL 基础————常用数据类型相关推荐

  1. MySQL基础:数据类型

    2019独角兽企业重金招聘Python工程师标准>>> MySQL数据库中,通过存储引擎来觉得表的类型,即觉得表的存储方式.同时,MySQL中也提供了数据类型来觉得存储的数据的类型, ...

  2. mysql基础常用语句

    sql最常用命令语句总结 我们以student表为例: 基本查询 表全部信息: select * from 表名称; //*可以理解代表全部 eg: 我们查询整个student表: select * ...

  3. MySQL基础之数据类型介绍

    数值型: 整型小数: 定点数浮点数 字符型: 较短的文本: char- varchar 较长的文本: text.blob(较长的二进制数据> 日期型: 整型 创建有符号与无符号整型 create ...

  4. 不是mysql常用类型的是什么_下列选项中不是MySQL中常用数据类型的是()

    下列选项型每个现金相应率在流入流出权重的现处理长短赋予依据加权金流时间收益时对时段时间. 中不中常型有迄今的亚环氧合酶发现. 用数标志替代现金跨境F的一般是(.模型投入提的假产出设前..评案.< ...

  5. Mysql学习笔记之常用数据类型

    http://www.cnblogs.com/doit8791/archive/2012/05/11/2495319.html 数据类型是定义列中可以存储什么数据以及该数据实际怎么存储的基本规则.My ...

  6. MySQL基础(二)—操作表记录

    上一篇MySQL基础(一)数据类型及数据表操作 这一篇是对表记录操作的笔记,其中操作的数据库在上一篇文章中有代码,可以去看一下. 1.插入 #插入 #如果是自增的,可以设置为null或者default ...

  7. MySql基础篇---003 SQL之DDL、DML、DCL使用篇:创建和管理表 ,数据处理之增删改,MySQL数据类型精讲 ,约束:联合主键

    第10章_创建和管理表 讲师:尚硅谷-宋红康(江湖人称:康师傅) 官网:http://www.atguigu.com 1. 基础知识 1.1 一条数据存储的过程 存储数据是处理数据的第一步.只有正确地 ...

  8. Redis基础 概念 数据类型 常用指令 Jedis 持久化

    Redis基础 概念 数据类型 常用指令 Jedis 持久化 1. Redis 简介 1.1 NoSQL概念 1.1.1 问题现象 1.1.2 NoSQL的概念 1.2 Redis概念 1.2.1 r ...

  9. Python基础知识与常用数据类型

    Python基础知识与常用数据类型 目录 Python基础知识与常用数据类型 一.Python概述: 二.Python中的基础语法: 三.Python内置数据结构: 4.附录 一.Python概述: ...

最新文章

  1. react-webpack-express
  2. 如何在HTML页面中插入百度地图
  3. Java 注册SIGINT信号,处理CTRL+C
  4. 人脸识别有什么漏洞,活体检测又是怎么防伪?
  5. VC中退出应用程序-几种很有用的方法
  6. mysql model only_full_group_by_MySql版本问题sql_mode=only_full_group_by的完美解决方案
  7. 使用Google GSON:额外的赠品:第二部分
  8. 不一样 使用别名 数据字段和bean_【修炼内功】[spring-framework] [3] Bean是如何创建又是如何销毁的?...
  9. 信息学奥赛一本通(2057:【例3.9 】星期几)
  10. Spark解决的问题与体系结构
  11. 青蛙学Linux—Zabbix Web使用之模板④基于触发器的动作和告警媒介
  12. visio2019安装教程
  13. 同表父子关系 的SQL查询语句的写法
  14. GTX高速收发器Transceiver概述与收发共同特征(UG476)
  15. win7删除文件提示“您需要权限才能执行此操作”的3种解决办法
  16. 【java毕业设计】基于java+swing+Eclipse的推箱子游戏设计与实现(毕业论文+程序源码)——推箱子游戏
  17. 运动控制器用c语言怎么编程,三菱运动控制器:Q173HCPU(N)/Q172HCPU(N)系列
  18. 如何快速搭建个人网站(服务器配置篇)
  19. 社会保险法相关知识--调基
  20. 成为或不成为开发者的拥护者

热门文章

  1. strictmath_Java StrictMath nextAfter()方法与示例
  2. 人工智能ai知识_人工智能中基于知识的代理层
  3. netframework 4.0内置处理JSON对象
  4. 子网掩码与子网个数、主机地址个数的关系
  5. 线程池三种队列使用,SynchronousQueue,LinkedBlockingQueue,ArrayBlockingQueue
  6. 多多进宝推广团队_多多进宝推广形式及推手寻找、佣金结算方式是怎样的?
  7. 人脸检测算法_腾讯已开源高精度人脸检测算法DSFD
  8. java不同类间调用数组_请问:JAVA中两个类中的方法都需要调用另一个类的数组进行对数组的初始化和调用。...
  9. php表白情话,朋友圈唯美表白短句情话 适合发朋友圈的情话
  10. Win7笔记本查看无线网卡是否“支持的承载网络”的方法