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

news2024/10/1 5:39:36

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


文章目录

  • 【MySQL】第十六部分 MySQL数据类型详解
  • 16. MySQL数据类型详解
    • 16.1 整数类型
    • 16.2 浮点类型
    • 16.3 定点数类型
    • 16.4 位类型 BIT
    • 16.5 日期和时间类型
    • 16.6 文本字符串类型
      • 16.6.1 CHAR VS VARCHAR类型
      • 16.6.2 TEXT类型
      • 16.6.3 ENUM类型
      • 16.6.4 SET类型
    • 16.7 二进制字符串类型
      • 16.7.1 BINARY和VARBINARY
      • 16.7.2 BLOB类型
    • 16.8 JSON 类型
    • 综上
  • 总结


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支持的浮点数类型,分别是 FLOATDOUBLE

  • 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.999999.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类型通常用来表示带时区的年、月、日、时、分、秒
类型名称字节日期格式最小值最大值
YEAR1YYYY或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 文本字符串类型

文本字符串总体上分为CHARVARCHARTINYTEXTTEXTMEDIUMTEXTLONGTEXTENUMSET等类型。


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,独立出一张表,用主键来对应,避免影响其他字段索引的效率

总结

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

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

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

相关文章

文件管理(9)

文件管理 0 引言 为什么要引入文件系统&#xff1f; 信息管理的需要&#xff1a;用户面前提供一种规格化的机制&#xff0c;方便用户对文件的存取、提高效率。操作系统本身需要–操作系统本身也不是常驻内存的&#xff0c;也有大量的信息需要存于外存。 1 文件定义 文件&a…

Python语言零基础入门教程(十四)

Python 日期和时间 Python 程序能用很多方式处理日期和时间&#xff0c;转换日期格式是一个常见的功能。 Python 提供了一个 time 和 calendar 模块可以用于格式化日期和时间。 时间间隔是以秒为单位的浮点小数。 每个时间戳都以自从1970年1月1日午夜&#xff08;历元&…

Linux上面配置Apache2支持Https(ssl)具体方案实现

虽然Nginx比较流行&#xff0c;但是由于一些老项目用到了Apache2来支持Web服务&#xff0c;最近想给服务上一个Https支持&#xff0c;虽然看似教程简单&#xff0c;但是也遇到一些特殊情况&#xff0c;经历了一番折腾也算是解决了所有问题&#xff0c;将过程记录如下。演示是基…

亿级高并发电商项目-- 实战篇 --万达商城项目 三(通用模块、商品服务模块、后台API模块、IDEA忽略文件显示等开发工作

专栏&#xff1a;高并发项目 &#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是小童&#xff0c;Java开发工程师&#xff0c;CSDN博客博主&#xff0c;Java领域新星创作者 &#x1f4d5;系列专栏&#xff1a;前端、Java、Java中间件大全、微信小程序、微信支付、若依框…

4.SpringWeb

一、创建项目LomBok:辅助开发工具&#xff0c;减少代码编写Spring Web:带上Spring MVC,可以做Web开发了Thymleaf: Web开发末班引擎&#xff08;不常用&#xff09;创建好&#xff0c;如下&#xff1a;static/ 放置静态资源的根目录templates/ 放置模板文件的根目录 二、资源配置…

新来的23岁软件测试员上来秀了波操作,把几个老员工看傻了

春招了&#xff0c;公司来了个小伙子&#xff0c;一看简历&#xff0c;嘿&#xff1f;22岁&#xff0c;这不刚毕业的小毛孩子嘛&#xff0c;结果没想到人家上来就把现有项目的性能优化了一遍&#xff0c;给公司节省了一半的成本&#xff0c;这种“王炸”打法&#xff0c;直接给…

152、【动态规划】leetcode ——416. 分割等和子集:滚动数组+二维数组(C++版本)

题目描述 原题链接&#xff1a;416. 分割等和子集 解题思路 题目要求是划分出两个相等的集合&#xff0c;那么这两个相等的集合相加&#xff0c;一定等于偶数并且为总集合的二分之一&#xff0c;若总集合求和后不为偶数&#xff0c;则一定不可以划分&#xff0c;直接返回fals…

黄绮珊“绮望三十”巡回演唱会3月4日广州中山纪念堂暖春开唱!

•中年成名 四十余载静待盛放歌手黄绮珊&#xff0c;1991年正式进入歌坛&#xff0c;至今已满三十周年。黄绮珊前半生的歌手之路好像并不是那么顺畅。虽然一直有着华语乐坛的顶尖歌唱实力&#xff0c;但在45岁之前&#xff0c;黄绮珊一直处于“歌红人不红”的状态。不少人听过黄…

GPU服务器安装显卡驱动、CUDA和cuDNN

GPU服务器安装cuda和cudnn1. 服务器驱动安装2. cuda安装3. cudNN安装4. 安装docker环境5. 安装nvidia-docker25.1 ubuntu系统安装5.2 centos系统安装6. 测试docker容调用GPU服务1. 服务器驱动安装 显卡驱动下载地址https://www.nvidia.cn/Download/index.aspx?langcn显卡驱动…

Zabbix 构建监控告警平台(三)

Zabbix User parametersZabbix Trigger1.Zabbix User parameters 1.1即自定义KEY 注意&#xff1a;mysql安装在被监测主机 [rootlocalhost ~]# yum -y install mariadb-server mariadb [rootlocalhost ~]# systemctl start mariadb [rootlocalhost ~]# mysqladmin -uroot statu…

[electron] 一 vue3.2+vite+electron 项目集成

一 开发环境系统&#xff1a;windows开发工具&#xff1a; git , vscode&#xff0c;termial环境依赖&#xff1a; node, npm 二 步骤2.1 通过vite 创建vue项目通过 终端执行命令&#xff0c;选择 模板 vuenpm init vite cd 项目目录 npm install npm run dev2.2 集成 electro…

T06 成绩排序

查找和排序 题目&#xff1a;输入任意&#xff08;用户&#xff0c;成绩&#xff09;序列&#xff0c;可以获得成绩从高到低或从低到高的排列,相同成绩 都按先录入排列在前的规则处理。 示例&#xff1a; jack 70 peter 96 Tom 70 smith 67 从高到低 成…

LC-70-爬楼梯

原题链接&#xff1a;爬楼梯 个人解法 思路&#xff1a; 动态规划 状态表示&#xff1a;f[i]表示走到第n阶台阶有几种方法 状态转移&#xff1a;f[i] f[i -1] f[i - 2] 这实际上就是斐波那契数列&#xff0c;通过转移可以看到&#xff0c;我们只用了三个变量&#xff0c;故…

Java、JSP职工人事管理系统设计与实现

技术&#xff1a;Java、JSP等摘要&#xff1a;现在随着我们这个社会的计算机技术的快速发展&#xff0c;计算机在企业管理中得到普遍的应用&#xff0c;现在我们利用计算机在实现企业职工的管理越来越重要。当今社会是快速发展的信息社会&#xff0c;自动化信息的作用也变得越来…

Python 之 NumPy 简介和创建数组

文章目录一、NumPy 简介1. 为什么要使用 NumPy2. NumPy 数据类型3. NumPy 数组属性4. NumPy 的 ndarray 对象二、numpy.array() 创建数组1. 基础理论2. 基础操作演示3. numpy.array() 参数详解三、numpy.arange() 生成区间数组四、numpy.linspace() 创建等差数列五、numpy.logs…

第四章 Opencv图像色彩空间与通道

文章目录1.色彩空间1-1.RGB/BGR色彩空间1-2.GRAY色彩空间1-3.HSV色彩空间2.通道2-1.拆分通道&#xff1a;split()方法1.拆BGR色彩空间图像的通道2.拆HSV色彩空间图像的通道2-2.合并通道&#xff1a;merge()方法1.B、G、R 通道的合并2.H、S、V 通道的合并3.B、G、R、A 通道的合并…

M100嵌入式自动吞吐式读写器|电动读卡机如何通过C#程序读取社保卡号

M100嵌入式自动吞吐式读写器|电动读卡机是一款双保护门功能读卡器&#xff0c;第一层防尘防异物机械门&#xff0c;第二层电动门。 M100嵌入式自动吞吐式读写器|电动读卡机采用耐高温、耐磨擦、高强度、抗老化的复合型塑胶为主体&#xff0c;在走卡通道两侧镶有不锈钢金属&…

YUV数据和格式

一、YUV简介 1.YUV说明 YUV是一种颜色编码方法&#xff0c; 与RGB&#xff08;红 - 绿 - 蓝&#xff09;不同。 <1>Y表示亮度分量&#xff0c;也叫灰阶值&#xff1a;如果只显示Y&#xff0c;图片会是一张黑白照 <2>U&#xff08;Cb&#xff09;表示色度分量&…

2022年12月电子学会Python等级考试试卷(三级)答案解析

目录 一、单选题(共25题&#xff0c;共50分) 二、判断题(共10题&#xff0c;共20分) 三、编程题(共3题&#xff0c;共30分) 青少年软件编程&#xff08;Python&#xff09;等级考试试卷&#xff08;三级&#xff09; 一、单选题(共25题&#xff0c;共50分) 1. 列表L1中全是…

你知道ChatGPT能搞钱吗?哎呦喂,不知道,那没意思

这段时间&#xff0c;热度zui大的是什么&#xff1f;答案是—— &#x1f389;&#x1f389;ChatGPT&#x1f389;&#x1f389;。去年11月底上线&#xff0c;当时仅在AI和科技圈内小火了一把&#xff0c;没想到在今年春节后&#xff0c;火爆出圈。 ChatGPT的爆火&#xff0c;对…