MySQL基础(13)- MySQL数据类型

目录

一、数据类型概述

1.MySQL中的数据类型

二、整型

1.数据类型可选属性

2.使用建议

三、浮点数、定点数、位类型

1.类型介绍

2.浮点类型

3.定点数类型

4.位类型

四、日期时间类型

1.YEAR

2.DATE

3.TIME

4.DATETIME

5.TIMESTAMP

6.TIMESTAMP和DATETIME的区别

五、文本字符串类型

1.CHAR与VARCHAR

2.TEXT

3.ENUM

4.SET

六、二进制类型与JSON类型

1.BINARY类型和VARBINARY类型

2.BLOB类型

TEXT和BLOB的使用注意事项

3.JSON类型


一、数据类型概述

1.MySQL中的数据类型

二、整型

mysql8.0定义数据超过范围会默认最大值

mysql5.7定义数据超过范围会报错

mysql5.7在定义类型后面会跟一个括号,括号里面的数代表可以显示数据的宽度(算正负号位)

1.数据类型可选属性

M:表示显示宽度

ZEROFILL:补位,不足x位的前面用0补充,使用时自动添加"UNSIGNED"

UNSIGNED:无符号,即非负数

2.使用建议

三、浮点数、定点数、位类型

1.类型介绍

REAL默认就是DOUBLE,但如果把SQL模式设定为启用"REAL_AS_FLOAT",那么MySQL就会默认是FLOAT。

sql 复制代码
SET sql_mode = "REAL_AS_FLOAT";

2.浮点类型

小数位如果超出位数,会自动进行四舍五入。

浮点类型会出现误差,尽量不要进行等号判断

MySQL 存储浮点数的格式为: 符号(S)、尾数(M)和 阶码(E)。因此,无论有没有符号,MySQL 的

浮点数都会存储表示符号的部分。因此,所谓的无符号数取值范围,其实就是有符号数取值范围大

于等于零的部分。

3.定点数类型

定点数在MySQL底层使用字符串存储

浮点数VS定点数

浮点数相对于定点数的优点是在长度一定的情况下,浮点类型取值范围大,但是不精准,适用于需

要取值范围大,又可以容忍微小误差的科学计算场景(比如计算化学、分子建模、流体动力学等)

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

计算的场景)

"由于 DECIMAL 数据类型的精准性,在我们的项目中,除了极少数(比如商品编号)用到整数类型

外,其他的数值都用的是 DECIMAL,原因就是这个项目所处的零售行业,要求精准,一分钱也不

能差。"

4.位类型

默认为1位

四、日期时间类型

1.YEAR

默认为4位

以2位字符串格式表示YEAR类型,最小值为00,最大值为99

  • 当取值为01-69时,表示2001到2069
  • 当取值为70-99时,表示1970到1999
  • 当取值整数的0或00添加,表示0000年
  • 当取值是日期/字符串添加'0',表示2000年

不建议使用2位格式

2.DATE

存在隐式转换

3.TIME

TIME类型用来表示时间,不包含日期部分。在MySQL中,需要3个字节 的存储空间来存储TIME类

型的数据,可以使用"HH:MM:SS"格式来表示TIME类型,其中,HH表示小时,MM表示分钟,SS

表示秒。

在MySQL中,向TIME类型的字段插入数据时,也可以使用几种不同的格式。

  • 可以使用带有冒号的字符串,比如'D HH:MM:SS'、'HH:MM:SS'、'HH:MM'、'D HH:MM'、'D HH'或'SS'格式,都能被正确地插入TIME类型的字段中。其中D表示天,其最小值为0,最大值为34。如果使用带有D格式的字符串插入TIME类型的字段时,D会被转化为小时,计算格式为D*24+HH。当使用带有冒号并且不带D的字符串表示时间时,表示当天的时间,比如12:10表示12:10:00,而不是00:12:10。
  • 可以使用不带有冒号的字符串或者数字,格式为' HHMMSS'或者 HHMMSS。如果插入一个不合法的字符串或者数字,MySQL在存储数据时,会将其自动转化为00:00:00进行存储。比如1210,MySQL会将最右边的两位解析成秒,表示00:12:10,而不是12:10:00。
  • 使用CURRENT_TIME()或者 NOW(),会插入当前系统的时间。

4.DATETIME

DATETIME类型在所有的日期时间类型中占用的存储空间最大,总共需要8个字节的存储空间。在格式上为DATE类型和TIME类型的组合,可以表示为YYYY-MM-DD HH:MM:SS,其中YY表示年份,MM表示月份,DD表示日期,HH表示小时,MM表示分钟,SS表示秒。

在向DATETIME类型的字段插入数据时,同样需要满足一定的格式条件。

  • 以 YYYY-MM-DD HH:MM:SS格式或者 YYYYMMDDHHMMSS 格式的字符串插入DATETIME类型的字段时,最小值为1000-01-01 00:00:00,最大值为9999-12-03 23:59:59.
  • 以YYYYMMDDHHMMSS格式的数字插入DATETIME类型的字段时,会被转化为YYYY-MM-DD HH:MM:SS格式。
  • 以 YY-MM-DD HH:MM:SS格式或者 YYMMDDHHMMSS 格式的字符串插入DATETIME类型的字段时,两位数的年份规则符合YEAR类型的规则,00到69表示2000到2069;70到99表示1970到1999。
  • 使用函数 CURRENT_TIMESTAMP()和NOW(),可以向DATETIME类型的字段插入系统的当前日期和时间。

5.TIMESTAMP

TIMESTAMP类型也可以表示日期时间,其显示格式与DATETIME类型相同,都是YYYY-MM-DD HH:MM:SS,需要4个字节的存储空间。但是TIMESTAMP存储的时间范围比DATETIME要小很多,只能存储"1970-01-01 00:00:01UTC"到"2038-01-19 03:14:07 UTC"之间的时间。其中,UTC表示世界统一时间,也叫作世界标准时间。

++存储教据的时候需要对当前时间所在的时区进行转换,查询数据的时候再将时间转换回当前的时区,因此使用TIMESTAMP存储的同一个时间值,在不同的时区查询时会显示不同的时间。++

向TIMESTAMP类型的字段插入数据时,当插入的数据格式满足Y-MM-DD HH:MM:SS和YYMMDDHHMMSS时,两位数值的年份同样符合YEAR类型的规则条件,只不过表示的时间范围要小很多。

如果向TIMESTAMP类型的字段插入的时间超出了TIMESTAMP类型的范围,则MVSOL会抛出错误信息。

6.TIMESTAMP和DATETIME的区别

  • TIMESTAMP存储空间比较小,表示的日期时间范围也比较小
  • 底层存储方式不同,TIMESTAMP底层存储的是毫秒值,距离1970-1-10:0:00毫秒的毫秒值。
  • 两个日期比较大小或日期计算时,TIMESTAMP更方便、更快。
  • TIMESTAMP和时区有关。TIMESTAMP会根据用户的时区不同,显示不同的结果。而DATETIME则只能反映出插入时当地的时区,其他时区的人查看数据必然会有误差的。

五、文本字符串类型

1.CHAR与VARCHAR

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

2.TEXT

由于实际存储的长度不确定,MySQL 不允许 TEXT 类型的字段做主键。遇到这种情况,你只能采用 CHAR(M),或者 VARCHAR(M) 。

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

3.ENUM

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

忽略大小写

4.SET

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

SET类型在存储数据时成员个数越多,其占用的存储空间越大。注意:SET类型在选取成员时,可以一次选择多个成员,这一点与ENUM类型不同。

六、二进制类型与JSON类型

1.BINARY类型和VARBINARY类型

  • BINARY和VARBINARY类似于CHAR和VARCHAR,只是它们存储的是二进制字符串。
  • BINARY (M)为固定长度的二进制字符串,M表示最多能存储的字节数,取值范围是0~255个字符。如果未指定(M),表示只能存储1个字节 。例如BINARY (8),表示最多能存储8个字节,如果字段值不足(M)个字节,将在右边填充"0'以补齐指定长度。
  • VARBINARY(M)为可变长度的二进制字符串,M表示最多能存储的字节数,总字节数不能超过行的字节长度限制65535,另外还要考虑额外字节开销,VARBINARY类型的数据除了存储数据本身外,还需要1或2个字节来存储数据的字节数。VARBINARY类型 必须指定(M),否则报错。

2.BLOB类型

  • BLOB是一个 二进制大对象,可以容纳可变数量的数据。
  • MySQL中的BLOB类型包括TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB 4种类型,它们可容纳值的最大长度不同。可以存储一个二进制的大对象,比如 图片、 音频 和 视频 等。
  • 需要注意的是,在实际工作中,往往不会在MSQL数据库中使用BLOB类型存储大对象数据,通常会将图片、音频和视频文件存储到 服务器的磁盘上,并将图片、音频和视频的访问路径存储到MySQL中。
TEXT和BLOB的使用注意事项
  • BLOB和TEXT值也会引起自己的一些问题,特别是执行了大量的删除或更新操作的时候。删除这种值会在数据表中留下很大的" 空洞",以后填入这些"空洞"的记录可能长度不同。为了提高性能,建议定期使用 OPTIMIZETABLE 功能对这类表进行 碎片整理 。
  • 如果需要对大文本字段进行模糊查询,MSOL提供了 前缀索引。但是仍然要在不必要的时候避免检索大型的BLOB或TEXT值。例如,SELECT*查询就不是很好的想法,除非你能够确定作为约束条件的WHERE子句只会找到所需要的数据行。否则,你可能毫无目的地在网络上传输大量的值。
  • 把BLOB或TEXT列 分离到单独的表 中。在某些环境中,如果把这些数据列移动到第二张数据表中,可以让你把原数据表中的数据列转换为固定长度的数据行格式,那么它就是有意义的。这会 减少主表中的碎片,使你得到固定长度数据行的性能优势。它还使你在主数据表上运行SELECT*查询的时候不会通过网络传输大量的BLOB或TEXT值。

3.JSON类型

JSON (JavaScript object Notation)是一种轻量级的 数据交换格式。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。它易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。JSON 可以将JavaScript 对象中表示的一组数据转换为字符串,然后就可以在网络或者程序之间轻松地传递这个字符串,并在需要的时候将它还原为各编程语言所支持的数据格式。

相关推荐
大王只是带我巡了个山15 分钟前
优化 OR 条件过多导致的查询超时
数据库·mysql·join·or 优化·or 超时·查询超时
木鬼与槐28 分钟前
MySQL高阶1892-页面推荐2
mysql
gma99943 分钟前
MySQL程序
数据库·mysql
神秘的土鸡1 小时前
Linux中Docker容器构建MariaDB数据库教程
linux·运维·服务器·数据库·docker·mariadb
汪公子4921 小时前
使用k8s搭建mariadb+nginx+wordpress
数据库·nginx·mariadb
Java__攻城狮1 小时前
navicat无法连接远程mysql数据库1130报错的解决方法
数据库·mysql
爬山算法1 小时前
Oracle(129) 如何使用闪回归档(Flashback Archive)?
数据库·oracle
程序员大金1 小时前
基于SSM+Vue+MySQL的酒店管理系统
前端·vue.js·后端·mysql·spring·tomcat·mybatis
Kk.6161 小时前
SQL编程题复习(24/9/20)
数据库·sql·pta考试·专本贯通
程序员大金2 小时前
基于SpringBoot的旅游管理系统
java·vue.js·spring boot·后端·mysql·spring·旅游