MySQL 基础————常用数据类型

引言

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

一、类型选择的原则

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

第二点非常重要原则是:

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

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

二、MySQL常见数据类型

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

数值型、字符型、日期型

2.1 数值型

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

2.1.1 整数

整型共有 5 种:

TypeStorage (Bytes)Minimum Value SignedMinimum Value UnsignedMaximum Value SignedMaximum Value Unsigned
TINYINT1-1280127255
SMALLINT2-3276803276765535
MEDIUMINT3-83886080838860716777215
INT4-2147483648021474836474294967295
BIGINT8-2630263-1264-1

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

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

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

2.1.2 定点数(Fixed-Point)

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

DECIMAL NUMERIC

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

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最常用的字符型是 CHAR VARCHAR ,他们有相似处,同时存取却也存在差异。

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

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

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

ValueCHAR(4)Storage RequiredVARCHAR(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

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/558727.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL 基础 ———— SAVEPOINT 的应用

引言 savepoint 关键字用于在数据库事务中设置一个存储点,在一个较长的事务中暂存数据,如果在事务末尾执行回滚,可选择性的回滚到 savepoint 设置的暂存点。 本文承接上一篇博客《MySQL 基础 ————事务与隔离级别总结》,进一…

MySQL 基础 ———— 视图的应用与总结

引言 视图是一种虚拟表,和普通表的使用是一样的,视图的一大特点就是“临时性”,是通过表动态生成的数据,只保存SQL逻辑,不保存查询结果。 视图在实际生产中主要有两种应用场景: 1、多个地方用到同样的查…

MySQL 基础 ———— 变量

一、MySQL系统变量 系统变量是由系统提供,属于服务器层面。 系统变量分为:全局变量和会话变量。 全局变量一般要加 GLOBAL 关键字,例如在《MySQL 基础 ————事务与隔离级别总结》中提到的 GLOBAL TRANSACTION,就属于全局变量…

MySQL 基础 ———— 存储过程与函数

一、存储过程介绍 存储过程是一组预先编译好的SQL语句的集合,可理解成批处理语句。它的优点主要有以下几点: 1、提高代码的重用性; 2、简化操作; 3、减少了编译次数并且减少了和数据库服务器的连接次数,提高了效率…

MySQL 基础 ———— 流程控制结构

引言 MySQL 中的流程控制作为基础知识的最后一块拼图,显得并不是特别重要,而且,在实际生产开发中,也往往不需要通过它来进行程序的控制,那么为什么还要学习它呢?我认为有以下几点: 1、知识的完…

MySQL 高级 ———— MySQL逻辑架构图简介

引言 本篇文章介绍MySQL的逻辑架构图。 MySQL并不完美,但足够灵活,能够适应高要求环境。MySQL不仅可以嵌入到应用程序中,同时也可以支持数据仓库、内容搜索、和部署软件、高可用的冗余系统、在线事务处理系统等各种应用类型。 一、MySQL逻…

Java正则表达式总结

引言 正则表达式(英文:regular expression)是用于描述字符串规则的工具,是记录文本规则的代码。 它可以用来搜索、编辑、处理文本。现有编程语言都支持正则表达式的处理,但每种语言都有细微的差别。 在Java 中&…

Linux 实操 —— Linux 系统性能分析

引言 最近配合解决压测(性能测试)方面的问题,了解到了一些可以监控 Linux 系统性能指标,如CPU、IO、内存等的工具。 此篇博客主要讲解 Linux 系统监控的一些重点内容以及 sar 命令的使用。 一、Linux 性能分析聚焦 Linux 性能…

Java 动态代理解析

引言 本博客总结自《Java 编程思想》第十四章 一、实现第一个动态代理程序 代理是软件设计中重要的设计思想,它允许我们在调用实际操作之前或之后解耦式地编写额外的操作,而一旦不需要这些操作了,就可以轻易的移除它们。 浏览了《编程思想…

MySQL 基础 ————高频函数总结

一、MySQL函数调用方式 函数调用的基本语法: SELECT 函数(实参列表) [FROM 表] 其中,对于函数,需要重点关注三点: 1、函数的名称 2、参数列表 3、函数功能 二、函数的分类 在 MySQL中,函数分为两类:1、…

MySQL 高级 —— 复合索引简介(多列索引)

引言 复合索引是指包含多个数据列的索引,与之概念相对的是单列索引,仅包含一个数据列。在大多数情况下,建立多列索引的好处都要多于单列索引。另外,复合索引最多支持16个列,但请一定不要让复合索引包含太多的列&#…

MySQL 高级 —— 索引实现的思考

引言 最近看了一个公开课,是有关MySQL对索引设计的思考。详细讲解了几种索引实现的设计思考与利弊辨析,讨论了为什么MySQL默认情况下会使用B树索引,B树索引又对B树做了哪些结构改进。 本片博客通过个人的学习理解和总结,由几种简…

Git 初学札记(十)—— Reset 回退的三种状态解析

引言 工作中经常会涉及到需要本地代码覆盖更新的操作。有时候可能是从远端git 上直接覆盖更新,或者是其他本地分支覆盖更新当前分支等等。这个时候就需要用到 reset 操作。 reset 操作分为三种类型:Soft、Mixed、Hard。今天我们就来说说这三种类型究竟…

MySQL 高级 —— 深入理解 InnoDB 与 MyISAM

引言 在文件系统中,MySQL将每个数据库(也可以称之为schema)保存为数据目录下的一个子目录。创建表时,MySQL会在数据库子目录下创建一个与表同名的.frm文件保存表的定义。因为MySQL使用文件系统的目录和文件来保存数据库和表的定义…

关于 OutOfMemoryError 的总结与解决方法

引言 本文总结自周志明的《深入理解Java虚拟机》第二章部分内容。 这部分内容,可以为后续性能调优方面的工作起到铺垫作用。 一、什么是 OutOfMemoryError OurOfMemory 简称“OOM”, 直译为“内存耗尽”或“内存溢出”,当然,并…

Windows误关闭资源管理器重启的办法

引言 有时候Windows系统在开机后,在桌面底部的任务栏中无法正常加载必要的网络连接图标或音量图标等,导致无法手动操作音量或连接网络。这时候就会需要打开“任务管理器”重新启动“资源管理器”使其重新加载这些必要的控制图标。 但是由于操作失误&am…

MySQL高级 —— 高性能索引

引言 最近一直在抱着《高性能MySQL(第三版)》研究MySQL相关热点问题,诸如索引、查询优化等,这阶段的学习是前一段时间MySQL基础与官方的“阅读理解”的进一步延伸。 书中第五章详细阐述了如何设计高性能的索引,以及索…

MySQL高级 —— 查询性能优化

引言 承接《MySQL高级 —— 高性能索引》,本篇博客将围绕《高性能MySQL(第三版)》第六章内容进行总结和概括。 与索引的部分一样,SQL优化也是广大程序员深入MySQL的又一条必经之路。希望通过本篇博客的总结,能够为我…

Java常用设计模式————适配器模式

引言 由于无法直接使用某个类中的方法而采取的一种中间类转换的策略。将一个类的接口转换成另一个接口,让原本接口不兼容的类可以兼容。 适配器模式可以分为三种:类适配器、对象适配器、接口适配器。它们之间的区别主要体现在适配器角色与被适配角色之…

Java常用设计模式————桥接模式

引言 在实际的业务中,经常会遇到多维度的概念组合,公园的门票,颐和园有年票、月票、日票,故宫也有年票、月票、日票。那么不同的公园和票种类型就可以视为两种不同的纬度,它们之间会形成相互组合的关系。 在类的设计…