背景

介绍下MySQL数据库的基础数据库类型。方便开发同学对使用和设计MySQL数据库表结构有一个初步正确的认识。因为MySQL数据类型随着官方也在不断演进中,下面介绍的数据类型和特性是基于Mysql 5.6+版本来介绍的。

MySQL基础数据类型分类:数字类型

时间日期型

字符串类型

1.数字类型

整形数字

上表就是最常用5种数字类型。第一列是类型名称,第二列存储代表此类型需要的存储空间。第三四列为该类型有符号的最小最大的取值范围。第五六列为该类型无符号的最小最大的取值范围。

tinyint适合存个数有限的一类的类别字段,例如男女,是否可用,各种有限几个状态一类的。smallint适合存稍大一类的类别字段,例如网络端口。

用int和bigint做自增主键时候别忘记加无符号修饰符。不存负数记得把无符号修饰符加上。

浮点数类型

DECIMAL中M代表总位数,D是小数点后的位数。小数点和负数符号(-)不计入M。DECIMAL的最大位数(M)为65,支持的最大小数位(D)为30。每个值的整数和小数部分的存储分别确定。

FLOAT中M代表总位数,D是小数点后的位数。如果省略M和D,则将值存储到硬件允许的限制。单精度浮点数支持的最大小数(D)大约为7位。使用FLOAT可能会给你一些意想不到的问题, 因为MySQL中的所有计算都是以双倍精度完成的。

DOUBLE中M代表总位数,D是小数点后的位数。如果省略M和D,则将值存储到硬件允许的限制。双精度浮点数支持的最大小数(D)大约为15位。

注意:浮点型数据本身不是一个精确的数字,如果要将FLOAT或DOUBLE列与具有小数的数字进行比较,则不能使用相等(=)比较。此问题在大多数计算机语言中很常见,因为并非所有浮点值都可以精确存储。在某些情况下,将FLOAT更改为DOUBLE可以解决此问题。

附录:科学记数法是一种记数的方法。把一个数表示成a与10的n次幂相乘的形式(1≤a<10,n为整数),这种记数法叫做科学记数法。 例如:19971400000000=1.99714×10^13。计算器或电脑表达10的幂一般是用E或e,也就是1.99714E13=19971400000000。

精确浮点数类型DECIMAL到底需要多大存储空间?

每个值的整数和小数部分的存储分别确定。每部分每九位数的倍数需要四个字节存储, 剩余数字位数则需要0-4个字节存储。下边表给出了剩余数字位数和所需存储空间对应关系。

数字类型知识点巩固小测试

精确浮点数DECIMAL(20,6)字段到底需要多大空间存储?

2.时间日期类型

DATETIME和TIMESTAMP区别:MySQL将TIMESTAMP值从当前时区转换为UTC(世界标准时间,不属于任意时区。中国大陆、中国香港、中国澳门、中国台湾、蒙古国、新加坡、马来西亚、菲律宾、西澳大利亚州的时间与UTC的时差均为+8,也就是UTC+8)进行存储,进行检索时再从UTC转换回当前时区。(对于其他类型DATETIME,不会发生这种情况。)

DATETIME,TIMESTAMP和TIME类型可以设置包括(0-6位)秒的小数精度,(3)精确到毫秒(ms),(6)精确到微秒(μs)。默认不设置秒的小数精度。

有些同学可能会疑惑,为什么上边TIME类型小时部分有负数还有超过24的那么大数呢?这主要是因为TIME类型不仅可用于表示一天中的时间(必须小于24小时),还可以用于表示两个事件之间经过的时间或时间间隔(所以可能远大于24小时,甚至是负数形式)

附录:秒的小数精度(fsp)和存储字节数对应关系表

时间类型知识点巩固小测试

下面时间日期类型的字段需要多大空间存储?DATETIME(3)?

TIME(6)?

3.字符串类型

上面的M指的是字符个数。L表示给定字符串值的实际长度 (以字节为单位)。上边+的某某bytes表示记录变长字段字节长度需要的存储空间。

VARCHAR列中的值是可变长度的字符串。长度可以指定为从0-65535的任意值。VARCHAR的有效最大长度还受最大行大小 (在所有列之间共享的65535个字节) 和使用的字符集的限制。

Binary和 VARBINARY类型类似于 CHAR 和 VARCHAR,只是它们包含二进制字符串而不是非二进制字符串。 也就是说,它们包含字节字符串而不是字符字符串。 这意味着它们具有二进制字符集和排序规则,并且比较和排序基于值中字节的数值。

Binary 和 VARBINARY 允许的最大长度与 CHAR 和 VARCHAR 相同,只是 BINARY 和 VARBINARY 的长度是以字节而不是字符为单位的长度。

utf8mb4字符编码如果不考虑列之间共享的65535个字节,最大可以设置16383个字符个数。

字符串类型知识点巩固小测试

varchar(80)字段最大需要多大空间存储(utf8mb4字符编码)?

总结

如何选择合适的数据类型?合适的数据类型。

更小的数据类型。

尽可能用数字类型替换字符类型。

选用更小的数据类型减少存储空间,因为更小的数据类型需要的IO资源更低。 能用数字类型替代字符串类型的尽量替换,因为数字类型存储空间更小,而且数字类型没有字符串类型的字符集各种排序规则判断效率至少快3倍以上。

为什么会有上边数据类型的选择原则呢?

那就要从数据库数据存储结构讲起了。请看下边的简略的图。

磁盘空间是被划分为许多大小相同的块(Block)或者页(Page)的,Mysql默认页的大小是16KB。

一个表的这些数据块以链表的方式串联在一起。

数据是以行(Row)为单位一行一行的存放在磁盘上的块中,如上边简图所示。

在访问表中数据时,一次从磁盘中读出或者写入至少一个完整的块Block/页Page。换句话说MySql数据库最小读写单元就是一个块或页,哪怕你只需要页中的一条数据,mysql也需要把整个页读进内存再把它从内存中找出来。

因为数据定位操作是所有数据操作的基础,因此数据定位的效率也就是最直接影响所有数据库数据操作的效率核心点。MySql数据库读写又是以一个块或页为最小单元。因此应用越小的数据类型,相应的每个块(Block)内能容纳的行(Row)数量也就越多。相应的数据库数据定位操作所需要IO量就会减少,效率自然会更高效。

结合刚才学的知识看看下边的建表语句有哪些字段的数据类型可以改进?

CREATE TABLE `ac_account` (

`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增主键',

`account` varchar(32) NOT NULL COMMENT '账户号',

`ac_amount` float(10, 2) NOT NULL COMMENT '账户金额',

`account_status` int(1) NOT NULL DEFAULT 1 COMMENT '账户状态 : 0:无效,1:有效',

`create_user` varchar(255) NOT NULL COMMENT '创建人',

`create_time` varchar(20) NOT NULL DEFAULT '2010-01-01 00:00:00' COMMENT '创建时间',

PRIMARY KEY (`id`)

) ENGINE = InnoDB CHARSET = utf8mb4 COMMENT '账户表';

看完文章请帮忙做三件事:

如果你觉得这篇文章对你挺有启发和帮助,我想请你帮我三个忙:点赞, 让更多的人也能看到这篇内容从而收益(收藏不点赞,就是耍流氓)

关注我, 让我们成为长期关系。

文章有写的有问题或不清楚的地方, 第一时间留言评论指出,以便我能及时不断的改进文章质量,让更多的朋友受益。

mysql数据类型内存_MySQL数据库基本功-常用数据类型介绍和优化技巧相关推荐

  1. mysql optimize原理_MySQL数据库入门:表的Optimize 优化

    一.optimize优化原理 对mysql进行大量增删改操作,磁盘上的空间没有被立即收回(数据空间.索引位),而是等待新的数据来填充空缺 -- 这些空间可以被后续的insert操作利用,但如果记录是变 ...

  2. mysql的real类型_数据库的常用数据类型有哪些?

    数据库的常用数据类型有哪些? 一. 整数数据类型:整数数据类型是最常用的数据类型之一. 1.INT (INTEGER) INT (或INTEGER)数据类型存储从-2的31次方 (-2 ,147 ,4 ...

  3. mysql数据类型内存_mysql 存储金额类型,用什么数据类型比较可靠,一般企业数据用什么数据类型?...

    展开全部 对于游戏币等代币,一般存储为int类型是可行的.问题在于62616964757a686964616fe78988e69d8331333433626438越界,int类型长度为11位. 在存储 ...

  4. mysql数据库中常用的类型_MySQL数据库中常用字段类型

    MySQL数据库中常用字段类型 整数型:TINYINT,SMALLINT,INT,BIGINT 小数型:FLOAT,DOUBLE,DECIMAL(M,D) 字符型:CHAR,VARCHAR 日期型:D ...

  5. like mysql 相反_Mysql数据库的常用操作

    你这么优秀,一定只想把"柠檬班"置顶 ▲ 本文由柠檬班Python10期VIP学员Boy原创. 本文主要介绍mysql数据库的查询操作,捎带脚增删改操作. ·增 · insert  ...

  6. mysql api查询例子_MySQL数据库:常用查询的例子Frommysqlapi

    本文主要向大家介绍了MySQL数据库的常用查询的例子Frommysqlapi,通过具体的实例让大家了解,希望对大家学习MySQL数据库有所帮助. 常用查询的例子 下面是一些学习如何用MySQL解决一些 ...

  7. mysql数据库表类型设置_mysql数据库表的类型介绍

    目录 前言 之前我们讲了下载安装数据库,还有如何卸载(虽然直接重装系统就好) 那么现在让我们来讲讲 """ 1.数据库与表的剩余操作 编码配置.引擎介绍 2.数据库字段的 ...

  8. mysql数据库游标有什么特性_MySQL数据库游标的概念介绍和游标的使用讲解

    一.MySQL游标的概念 1.游标介绍 MySQL的游标(cursor)是一个重要的概念,通过查找资料与自己的理解,主要得出以下几点关于自己的理解. 有数据缓冲的思想:游标的设计是一种数据缓冲区的思想 ...

  9. mysql字段约束_mysql数据库之表操作及字段约束条件

    一.存储引擎 二.表介绍 表相当于文件,表中的一条记录就相当于文件的一行内容,不同的是,表中的一条记录有对应的标题,称为表的字段 id name age sex 1 li 12 male 2 liu ...

  10. mysql 苏勇_MySQL数据库基础学习笔记(整理自苏勇老师的MySQL基础课程视频)

    一.mysql安装及基本配置 1.安装 Mysql官网:www.mysql.com 开源版本(MySQL Community Server) --安装系统自带版本(如果需要更高版本可到官网下载) # ...

最新文章

  1. 3层-CNN卷积神经网络预测MNIST数字
  2. hadoop源码datanode序列图
  3. oracle报错ora-12162,ORA-12162: TNS: 指定的 Net 服务名不正确
  4. Python正则表达式的7个使用典范
  5. 【深度学习】神经网络的Python代码实现
  6. IDEA主题设置(字体颜色背景)
  7. 大话设计模式—组合模式
  8. JAVA代码覆盖率工具JaCoCo-原理简单分析
  9. webpack devServer
  10. supervisord管理进程详解
  11. .NET 云原生架构师训练营(设计原则设计模式)--学习笔记
  12. tomcat命令linux,Linux下一些操作Tomcat的命令
  13. JavaScript高级程序设计 DOM事件处理 读书笔记
  14. 【2020团体程序设计天梯赛】L1部分(PTA,L1-065到L1-072)题解代码
  15. 如何使用Python进行时间序列预测的基线预测
  16. warning C4996 sprintf This function or variable may be unsafe
  17. paip.提升用户体验---提示语
  18. java系统找不到文件_java编译系统找不到指定文件
  19. 在此计算机中仅有部分vs2010产品升级到sp1,解决安装Microsoft Visual Studio 2010 Service Pack 1 ,系统无法找到指定的对象
  20. 如何使用荣耀手机的计算机功能,华为荣耀手机投屏电脑教程

热门文章

  1. Sublime Text自定制代码片段之 快速生成html结构
  2. 英语单词词性顺口溜_英语单词词性分类
  3. 【论文翻译】Class-Incremental Few-Shot Object Detection
  4. 双驰推大规模个性化定制生产迎来颠覆性变革
  5. shell加密工具shc的安装
  6. 学习云计算为什么先学Linux?
  7. HTML5 常见问题 font标签设置字体未生效
  8. 怎么用计算机录制mp3的音频,电脑怎么录音,电脑录制音频的方法
  9. 集群容错机制:failover、failfast、failback、failsafe、forking
  10. Mac OS X磁盘重新分区后 BootCamp Windows启动项丢失