目录
一、数据类型概述
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。
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 对象中表示的一组数据转换为字符串,然后就可以在网络或者程序之间轻松地传递这个字符串,并在需要的时候将它还原为各编程语言所支持的数据格式。