【MySQL】第十六部分 MySQL数据类型详解

详解MySQL的常用数据类型 MySQL支持很多数据类型,以便我们能在复杂的业务场景中支持各种各样的数据格式,存储适当的数据内容。我们在设计数据库时,正确的使用数据库类型对整个数据库的整洁和高效,会有很大的帮助。 阅读详情

【MySQL】第十六部分 MySQL数据类型详解



16. MySQL数据类型详解

16.1 整数类型

整数类型字节有符号数取值范围无符号数取值范围
TINYINT1-128~1270~255
SMALLINT2-32768~327670~65535
MEDIUMINT3-8388608~83886070~16777215
INT,INTEGER4-2147483648~21474836470~4294967295
BIGINT8-9223372036854775808~92233720368547758070~18446744073709551615

上述类型使用的场景:

TINYINT:一般用于枚举数据,比如系统设定特定的身份。

SMALLINT:可以用于较小范围的统计数据,比如统计工厂的固定资产库存数量等。

MEDIUMINT:用于较大整数的计算,比如车站每日的客流量等。

INT、INTEGER:取值范围足够大,一般情况下不用考虑超限问题,用得最多。

BIGINT:只有当你处理特别巨大的整数时才会用到。比如: 双十一的交易量、大型门户网站点击量、证券公司衍生产品持仓等。

在实际的工作中,先确保数据不会超过取值范围,再去考虑如何节省空间,否则得不偿失.


16.2 浮点类型

浮点数和定点数类型的特点是可以处理小数,可以把整数看成小数的一个特例。因此,浮点数和定点数的使用场景,比整数大多了。 MySQL支持的浮点数类型,分别是 FLOAT、DOUBLE。

  • FLOAT 表示单精度浮点数;
  • DOUBLE 表示双精度浮点数;
    在这里插入图片描述

FLOAT 和 DOUBLE 它们之间主要的区别是: FLOAT 占用字节数少,取值范围小;DOUBLE 占用字节数多,取值范围也大.

浮点数类型精度会有误差:

CREATE TABLE test1(
	f1 DOUBLE
);

INSERT INTO test1
VALUES(0.47),(0.44),(0.19);

SELECT SUM(f1) 
FROM test1;

在这里插入图片描述


16.3 定点数类型

数据类型字节数含义
DECIMAL(M,D),DEC,NUMERICM+2字节有效范围由M和D决定 ( 0<=M<=65,0<=D<=30) M表示总位数,D表示小数点保留几位

例如: 定义DECIMAL(6,2)的类型,表示该取值范围是 -9999.99 到 9999.99。

浮点数 vs 定点数

浮点数相对于定点数的优点是在长度一定的情况下,浮点类型取值范围大,但是精度会缺失,适用场景: 需要取值范围大,但是可以容许微小误差的业务场景.

定点数类型取值范围相对小,但是精准,没有误差,适合于对精度要求极高的场景 比如涉及金额计算的场景.

ALTER TABLE test1 ADD f2 DECIMAL(6,2)

INSERT INTO test1(f2)
VALUES(0.47),(0.44),(0.19);

SELECT SUM(f2)
FROM test1;

在这里插入图片描述


16.4 位类型 BIT

BIT类型中存储的是二进制值,010101。

二进制字符串类型长度长度范围占用空间
BIT(M)M1 <= M <= 64约为(M + 7)/8个字节

BIT类型,如果没有指定(M),默认是1位,表示只能存1位的二进制值。在向BIT类型的字段中插入数据时,一定要确保插入的数据在BIT类型支持的范围内。

CREATE TABLE test1(
	f1 BIT(8),
	f2 BIT
)

INSERT INTO test1 
VALUES(12,0)

SELECT * FROM test1

16.5 日期和时间类型

  • YEAR类型通常用来表示年
  • DATE类型通常用来表示年、月、日
  • TIME类型通常用来表示时、分、秒
  • DATETIME类型通常用来表示年、月、日、时、分、秒
  • TIMESTAMP类型通常用来表示带时区的年、月、日、时、分、秒
类型名称字节日期格式最小值最大值
YEAR年1YYYY或YY19012155
TIME时间3HH:MM:SS-838:59:59838:59:59
DATE日期3YYYY-MM-DD1000-01-019999-12-03
DATETIME日期时间8YYYY-MM-DD HH:MM:SS1000-01-01 00:00:009999-12-31 23:59:59
TIMESTAMP日期时间4YYYY-MM-DD HH:MM:SS1970-01-01 00:00:00 UTC2038-01-19 03:14:07UTC

TIMESTAMP和DATETIME的区别:

  1. TIMESTAMP存储空间比较小,表示的日期时间范围也比较小

  2. 底层存储方式不同,TIMESTAMP底层存储的是毫秒值,距离1970-1-1 0:0:0 0毫秒的毫秒值。

  3. 两个日期比较大小或日期计算时,TIMESTAMP更方便、更快。

  4. TIMESTAMP和时区有关。TIMESTAMP会根据用户的时区不同,显示不同的结果。而DATETIME则只能反映出插入时当地的时区,其他时区的人查看数据必然会有误差的。

在工作中,用得最多的日期时间类型,就是 DATETIME。

CREATE TABLE test_time(
	f1 YEAR,
	f2 DATE,
	f3 TIME,
	f4 DATETIME,
	f5 TIMESTAMP
)

INSERT INTO test_time
VALUES (CURRENT_DATE,CURRENT_DATE,CURRENT_TIME,NOW(),NOW())

SELECT * FROM test_time

在这里插入图片描述


16.6 文本字符串类型

文本字符串总体上分为CHAR、VARCHAR、TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT、ENUM、SET等类型。


16.6.1 CHAR VS VARCHAR类型

字符串(文本)类型特点长度长度范围占用的存储空间
CHAR(M)固定长度M0 <= M <= 255M个字节
VARCHAR(M)可变长度M0 <= M <= 65535(实际长度 + 1) 个字节

CHAR(M) 类型一般需要预先定义字符串长度。如果不指定(M),则表示长度默认是1个字符,如果数据的实际长度比CHAR类型声明的长度小,则会在右侧填充空格, 定义CHAR类型字段时,声明的字段长度即为CHAR类型字段所占的存储空间的字节数。

VARCHAR(M)类型必须指定长度M,否则报错,MySQL4.0版本以下,varchar(20):指的是20字节,如果存放UTF8汉字时,只能存6个(每个汉字3字节) ;MySQL5.0版本以上,varchar(20):指的是20字符。

类型特点空间上时间上适用场景
CHAR(M)固定长度浪费存储空间效率高存储不大,速度要求高
VARCHAR(M)可变长度节省存储空间效率低存储大,速度要求不高

情况1:存储很短的信息。比如门牌号码101,201……这样很短的信息应该用char,因为varchar还要占个byte用于存储信息长度。

情况2:固定长度的。比如使用uuid作为主键,那用char应该更合适。因为他固定长度,varchar动态根据长度的特性就消失了,而且还要占个长度信息。

情况3:十分频繁改变的column。因为varchar每次存储都要有额外的计算,得到长度等工作,如果一个非常频繁改变的,那就要有很多的精力用于计算,而这些对于char来说是不需要的。


16.6.2 TEXT类型

文本字符串类型特点长度长度范围占用的存储空间
TINYTEXT小文本、可变长度L0 <= L <= 255L + 2 个字节
TEXT文本、可变长度L0 <= L <= 65535L + 2 个字节
MEDIUMTEXT中等文本、可变长度L0 <= L <= 16777215L + 3 个字节
LONGTEXT大文本、可变长度L0 <= L<= 4294967295(相当于4GB)L + 4 个字节

TEXT文本类型,可以存比较大的文本段,搜索速度稍慢,因此如果不是特别大的内容,建议使用CHAR,VARCHAR来代替。TEXT和BLOB类型的数据删除后容易导致“空洞”,使得文件碎片比较多,所以频繁使用的表不建议包含TEXT类型字段,建议单独分出去,单独用一个表。


16.6.3 ENUM类型

ENUM类型也叫作枚举类型,ENUM类型的取值范围需要在定义字段时进行指定。设置字段值时,ENUM类型只允许从成员中选取单个值,不能一次选取多个值。

文本字符串类型长度长度范围占用的存储空间
ENUML1 <= L <= 655351或2个字节
CREATE TABLE test_enum
(
	gender ENUM("男","女"),
	season ENUM("春","夏","秋","冬")
)

INSERT INTO test_enum
VALUES("男","秋")

# 当ENUM类型的字段没有声明为NOT NULL时,插入NULL也是有效的
INSERT INTO test_enum
VALUES(NULL,NULL);

# 允许按指定索引位置的枚举值
INSERT INTO test_enum
VALUES(1,2)

SELECT * FROM test_enum

在这里插入图片描述

16.6.4 SET类型

SET类型,SET表示一个字符串对象,可以包含0个或多个成员,但成员个数的上限为64。设置字段值时,可以取值范围内的 0 个或多个值。

成员个数范围(L表示实际成员个数)占用的存储空间
1 <= L <= 81个字节
9 <= L <= 162个字节
17 <= L <= 243个字节
25 <= L <= 324个字节
33 <= L <= 648个字节
CREATE TABLE test_set(
s SET ('A', 'B', 'C')
);

INSERT INTO test_set (s) VALUES ('A'), ('A,B');

#插入重复的SET类型成员时,MySQL会自动删除重复的成员
INSERT INTO test_set (s) VALUES ('A,B,C,A');

#向SET类型的字段插入SET成员中不存在的值时,MySQL会抛出错误。
INSERT INTO test_set (s) VALUES ('A,B,C,D');

SELECT *
FROM test_set;

16.7 二进制字符串类型

MySQL中的二进制字符串类型主要存储一些二进制数据,比如可以存储图片、音频和视频等二进制数据。MySQL中支持的二进制字符串类型主要包括BINARY、VARBINARY、TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB类型。


16.7.1 BINARY和VARBINARY

二进制字符串类型特点值的长度占用空间
BINARY(M)固定长度M (0 <= M <= 255)M个字节
VARBINARY(M)可变长度M(0 <= M <= 65535)M+1个字节

类似于CHAR和VARCHAR,区别只是它们存储的是二进制字符串

BINARY (M)为固定长度的二进制字符串,M表示最多能存储的字节数,取值范围是0~255个字符。如果未指定(M),表示只能存储1个字节。例如BINARY (8),表示最多能存储8个字节,如果字段值不足(M)个字节,将在右边填充’\0’以补齐指定长度。

VARBINARY (M)为可变长度的二进制字符串,M表示最多能存储的字节数,总字节数不能超过行的字节长度限制65535,另外还要考虑额外字节开销,VARBINARY类型的数据除了存储数据本身外,还需要1或2个字节来存储数据的字节数。VARBINARY类型必须指定(M),否则报错。


16.7.2 BLOB类型

BLOB是一个二进制大对象,可以容纳可变数量的数据。

二进制字符串类型值的长度长度范围占用空间
TINYBLOBL0 <= L <= 255L + 1 个字节
BLOBL0 <= L <= 65535(相当于64KB)L + 2 个字节
MEDIUMBLOBL0 <= L <= 16777215 (相当于16MB)L + 3 个字节
LONGBLOBL0 <= L <= 4294967295(相当于4GB)L + 4 个字节

需要注意的是,在实际工作中,往往不会在MySQL数据库中使用BLOB类型存储大对象数据,通常会将图片、音频和视频文件存储到服务器的磁盘上,并将图片、音频和视频的访问路径存储到MySQL中。


16.8 JSON 类型

JSON是一种轻量级的数据交换格式, JSON 可以将 JavaScript 对象中表示的一组数据转换为字符串,然后就可以在网络或者程序之间轻松地传递这个字符串,并在需要的时候将它还原为各编程语言所支持的数据格式。

CREATE TABLE test_json(
	js json
);

INSERT INTO test_json (js) 
VALUES ('{"name":"lilei", "age":18, "address":{"province":"shanghai", "city":"shanghai"}}');

综上

  1. 定义整数的时候,就用INT
  2. 定义浮点数的时候,就用DECIMAL(M,D)
  3. 定义时间和日期的时候,就用DATETIME
  4. 定义字符串的时候,根据实际的需求选择CHAR或者VARCHAR
  5. 定义字段为TEXT,独立出一张表,用主键来对应,避免影响其他字段索引的效率

总结

以上就是今天要讲的内容,希望对大家有所帮助!!!

VCSA 6.7证书更新全流程指南:从故障诊断到完整替换 本文详细介绍了VCSA 6.7证书更新的全流程,包括故障诊断、证书替换操作步骤及常见问题解决方案。通过使用官方脚本和证书管理器,帮助管理员快速解决证书过期问题,确保vCenter系统的稳定运行。特别强调了STS证书修复和全量证书重置的关键步骤,适用于vcsa6.7环境下的证书管理需求。 阅读详情

相关推荐

Jenkins测试详细使用教程(二):jenkins两种主要构建方法

Jenkins有两种定义构建作业的主要方法:(自由风格项目)和Pipeline(流水线项目)。

m0_62825058的博客 2435

MySQL数据类型详解

在学习MySQL数据类型之前,我们先了解一下什么是字节,什么是字符。在MySQL中,字节和字符是两个常见的概念,它们代表着不同的数据类型。理解字节和字符的区别对于正确使用MySQL具有至关重要的作用。

XIU的博客 1511

Spine换装系统深度优化:从局部换肤到动态合批的进阶之路

本文深入探讨了Spine换装系统的性能优化策略,从局部换肤到动态合批的进阶技术。通过分析传统方案的性能瓶颈,提出动态合批、GPU Instancing等高级优化方法,显著降低Draw Call和内存占用,提升游戏性能。适用于MMO和大型游戏开发,帮助技术美术和工程师突破大规模换装场景的性能限制。

vulkan6gpu的博客 554

MySQL(18)MySQL数据类型:字符串类型

字符串类型用来存储字符串数据,还可以存储图片和声音的二进制数据。字符串可以区分或者不区分大小写的串比较,还可以进行正则表达式的匹配查找。MySQL 中的字符串类型有 CHAR、VARCHAR、TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT、ENUM、SET 等。下表中列出了 MySQL 中的字符串数据类型,括号中的M表示可以为其指定长度。CHAR(M)固定长度非二进制字符串M 字节,1VARCHAR(M)变长非二进制字符串L+1字节,在此,L< = M和 1。

逍遥人世欢 1691

解决windows10下无法安装.net framework 3.5(包括.net2.0和3.0)

入域电脑,win10系统中安装 .net framework 3.5(包括.net2.0和3.0)

God_me_1的博客 4万+

MATLAB闪退别慌!5分钟搞定Windows系统预设文件修复(附详细截图)

本文针对MATLAB在Windows系统下频繁闪退的问题,提供了快速有效的解决方案。核心在于修复或重置损坏的MATLAB预设文件,通过图文并茂的五步法,指导用户定位AppData目录、重命名预设文件夹,从而让MATLAB自动生成全新配置以解决闪退。文章还涵盖了问题诊断、设置备份及进阶排查方法,帮助用户彻底根除启动故障。

weixin_29234423的博客 926

MySQL数据类型之字符型

字符类型 类型 说明 N的含义 是否有字符集 最大长度 char(n) 定长字符 字符 是 255 varchar(n) 变长字符 字符 是 65535 binary(n) 定长二进制字节 字节 否 255 varbinary(n) 变长二进制字节 字节 否 65535 tinyblob 二进制大对象 字节 否 255 blob(n) 二进制大对象 字节 否 65535 mediumblob(n) 二进制大对象 字节 否 16M longblob(n) 二进制大对

morris 5300

Unity的粒子系统使用shadergraph(内置管线)制作的一个顶点偏移shader,但是粒子模型移动时,顶点也会偏移?

🏆本文收录于 《全栈Bug调优(实战版)》 专栏,该专栏专注于分享我在真实项目开发中遇到的各类疑难Bug及其深层成因,并系统提供高效、可复现的解决思路和实操方案。无论你是刚入行的新手开发者,还是拥有多年项目经验的资深工程师,本专栏都将为你提供一条系统化、高质量的问题排查与优化路径,助力你加速成长,攻克技术壁垒,迈向技术价值最大化与职业发展的更高峰🚀!

**My Coding Family** 1174

【MySQL】【Navicat】MySQL&Navicat16安装步骤

如果新建了,等会用命令行安装Mysql的时候你会找不到初始的登入密码,其实在你输入mysqld --initialize 命令初始化mysql的时候会自动新建一个data文件夹。继续运行命令mysql -u root -p进行登录数据库,这时提示需要密码,然后就是用你上面的密码登录,我这里是+<js+A6pjapH。点击我的电脑->点击属性->点击高级系统设置->环境变量->系统变量path->编辑->新建(把安装mysql的bin路径放上)解决方法1:打开服务,找到mysql,打开服务。

SSSSSun_的博客 4170

Android性能分析——hprof文件分析(一)

hprof  文件是 Java 堆转储文件(Heap Dump File)的标准格式,用于保存 Java 虚拟机(JVM)在某个时间点的内存快照。这种文件对于分析内存泄漏、内存使用情况和对象分配模式非常有用。

小旭的专栏 1880

Unity零基础到进阶 ☀️| Unity中的 GC及优化 超级全面解析 ☆(ゝω・)v 建议收藏!

介绍: 在游戏运行的时候,数据主要存储在内存中,当游戏的数据在不需要的时候,存储当前数据的内存就可以被回收以再次使用。内存垃圾是指当前废弃数据所占用的内存,垃圾回收(GC)是指将废弃的内存重新回收再次使用的过程。 Unity中将垃圾回收当作内存管理的一部分,如果游戏中废弃数据占用内存较大,则游戏的性能会受到极大影响,此时垃圾回收会成为游戏性能的一大障碍点。 本文我们主要学习垃圾回收的机制,垃圾回收如何被触发以及如何提GC收效率来提高游戏的性能。 Unity内存管理机制简介 要想了解垃圾回收如何工作以及何时被

努力前行,总会成为自己心中的那道光 6万+

MySQL数据类型---字符串

字符串 MySQL 中的字符串类型有 char、varchar、tinytext、text、medlumtext、longtext等. char(n)若存入字符数小于n,则会用空格填充,查询时再去掉,所以char类型存储的字符串末尾不能有空格。 varchar(n)是存入的实际字符数+1个字节(n<=255)或2个字节(n>255),所以varchar(4)存入3个字符将占用4个字节。 char类型的字符串检索速度要比varchar类型的快。 例: create table test1( cha

Cat God 007的博客 4669

2026年软考信息安全工程师备考指南

信息安全工程师是信息产业部和人事部举办的软考中新增开的一门考试。软考全称全国计算机技术与软件专业技术资格(水平)考试,这门新开的信息安全工程师分属该考试“信息系统”专业,位处中级资格,是信息产业部和人事部在最新的“国人厅发[2007]139号文件中新增的专业。2016年下半年,第一次开考信息安全工程师(中级)考试。 考试科目: 1.信息安全基础知识,考试时间为150分钟,笔试,选择题; ...

鹿鸣天涯 7397

MySQL 数据类型详解

摘要:本文系统梳理了 MySQL 中常用的数据类型,包括数值型、字符串型、二进制型、日期型等,通过对比分析、存储原理、实战示例和选择建议,帮助开发者在数据库设计时做出合理的数据类型选择,提升存储效率与查询性能。

此人很懒,什么都留下了...快进来看看吧 1909

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

【mysql】—— 数据类型详解

一篇文章带你认识 mysql 数据类型

m0_56069910的博客 6868

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

最全MySQL数据类型详解

一、概述 1、MySQL中的数据类型 2、常见数据类型的属性 二、各种数据类型精讲 1、整数类型 1.1 整数类型介绍 整数类型一共有 5 种,包括 TINYINT、SMALLINT、MEDIUMINT、INT(INTEGER)和 BIGINT。它们的区别如下表所示: 1.2 可选属性 1.2.1 M M 表示显示宽度,M的取值范围是(0, 255)。例如,int(5):当数据宽度小于5位的时候在数字前面需要用 字符填满宽度。该项功能需要配合“ ZEROFILL ”使用,表示用“0”填满宽度,否则指定

qq_44111805的博客 1万+

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

MySQL的常用数据类型详解

本文介绍了MySQL中常用的数据类型,包括数值类型(tinyint、bit、float、decimal)、字符串类型(char、varchar)、日期时间类型(date、datetime、timestamp)以及枚举和集合类型(enum、set)。文章通过示例演示了各类型的特点和使用限制,如tinyint的范围约束、float的精度丢失问题、varchar的变长存储特性等,并强调了数据类型本身作为MySQL约束机制的重要性。此外,还详细说明了各类型的存储需求和使用场景,帮助开发者合理选择数据类型,确保数据的

2301_80774875的博客 2427

【MySQL】详解MySQL数据类型

【MySQL】详解MySQL数据类型

m0_74265792的博客 3783

【MySQL基础】MySQL基本数据类型

MySQL基本数据类型超详细介绍

小杨的博客 6236

MySQL数据类型详解及部分使用范例

MySQL数据类型数据类型数值类型 数据类型 (因为看了看优快云没找到MySQL的数据类型就自己写一个…我也还在学习,第一次写有什么错还请大大们多多指教。) MySQL中数据表由多个字段构成, 每个字段可以制定不同的数据类型 数据类型用于规定数据的: 储存格式, 约束, 有效范围。 在定义数据表字段时,应根据实际情况选择合适的数据类型。 MySQL提供的数据类型主要包括 数值类型 日期类型 字符...

qq_45277133的博客 1043

MySQL数据类型

本文详细介绍了MySQL中的数据类型分类,包括数值类型、浮点类、字符串类、日期和时间类型以及enum和set类型。数值类型以tinyint为例,解释了其存储范围及使用场景,并展示了相关测试代码。浮点类介绍了float和decimal的语法及精度差异。字符串类对比了char和varchar的存储方式及适用场景。日期和时间类型包括date、datetime和timestamp,并提供了测试示例。最后,enum和set类型用于存储预定义的值,适合单选和多选数据,展示了其使用方法和查找技巧。通过这些数据类型的合理选

2302_80105876的博客 4270

详解MySQL数据类型

对MySQL数据类型的详细介绍

m0_62547912的博客 773

【MySQL】全面详解--数据类型

【包含了:整数类型、浮点类型、定点数类型、位类型、日期时间类型、文本字符串类型、枚举类型、集合类型、二进制字符串类型、空间数据类型、单值类型、集合类型】

小鳴人的博客 1164

MySQL 数据类型详解:字符串、数字、日期

MySQL 提供了**字符串(String)、数字(Numeric)和日期(Date & Time)**三大类数据类型,每种类型又有不同的子类型,以适应不同的业务需求。MySQL 提供了多种数据类型,每种类型都有其适用场景。合理选择数据类型可以提升存储效率、优化查询性能,并避免精度损失。希望这篇文章能帮助你在数据库设计时做出更好的选择!在 MySQL 中,选择合适的数据类型对于数据库的。当存储较长的文本或二进制数据时,使用。字符串类型用于存储文本数据,主要分为。数字类型用于存储整数或小数,主要分为。

qq39144563的博客 1120
上一篇: 【MySQL】第十五部分 数据的增删改(DML)
下一篇: 【MySQL】第十七部分 约束
Tree_wws
博客等级 码龄6年 1万+粉丝 185原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值