1、MySQL中的数据类型
类型 | 类型举例 |
---|---|
整数类型 | TINYINT、SMALLINT、MEDIUMINT、INT(或INTEGER)、BIGINT |
浮点类型 | FLOAT、DOUBLE |
定点数类型 | DECIMAL |
位类型 | BIT |
日期时间类型 | YEAR、TIME、DATE、DATETIME、TIMESTAMP |
文本字符串类型 | CHAR、VACHAR、TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT |
枚举类型 | ENUM |
集合类型 | SET |
二进制字符串类型 | BINARY、VARBINARY、TINYBLOB、BLOB、MEDIUMBLOB、LONGBLOB |
JSON类型 | JSON对象、JSON数组 |
常见数据类型的属性:
MySQL关键字 | 含义 |
---|---|
NULL | 数据列可包含NULL值 |
NOT NULL 数据列不允许包含NULL值 | |
DEFAULT | 默认值 |
PRIMARY KEY | 主键 |
AUTO_INCREMENT | 自动递增,适用于整数类型 |
UNSIGNED | 无符号 |
CHARACTER SET name | 指定一个字符集 |
2、整数类型介绍
整数类型一共有5种,包括TINYINT、SMALLINT、MEDIUMINT、INT(INTEGER)和BIGINT
整数类型 | 字节 | 有符号数取值范围 | 无符号取值范围 |
---|---|---|---|
TINYINT | 1 | -128~127 | 0~255 |
SMALLINT | 2 | -32768~32767 | 0~65535 |
MEIDUMINT | 3 | -8388608~8388607 | 0~16777215 |
INT、INTEGER | 4 | -2147483648~2147483647 | 0~4294967295 |
BIGINT | 8 | -9223372036854775808~9223372036854775807 | 0~18446744073709551615 |
2.1可选属性
2.1.1 M
M:表示显示宽度,M的取值范围是(0,255)。
2.1.2 UNSIGNED
UNSIGNED:无符号类型(非负)
2.1.3 ZEROFILL
ZEROFILL:0填充
3、浮点数类型介绍
浮点数和定点数类型的特点是可以处理小数。
Float:表示单精度浮点数
Double:表示双精度浮点数
MySQl存储浮点数的格式为:符号(S)、尾数(M)和阶码(E)。因此无论有没有符号,MySQL的浮点数都会存储表示符号的部分。
3.1 数据精度说明
对于浮点数类型,在MySQL中单精度值使用4个字节,双精度值使用8个字节。
1、MySQL允许使用非标准语法(其他数据库未必支持,因此如果涉及到数据迁移,则最好不要这么用):Float(M,D)或Double(M,D)。这里,M称为精度,D称为标度。(M,D)中M=整数位+小数位,D=小数位。D<=M<=255,)<=D<=30。
2、Float和Double类型在不指定(M,D)时,默认会按照实际的精度(由实际的硬件和操作系统决定)来显示。
3、浮点类型也可以加Unsigned,但是不会改编数据范围,只是没有负数了。
4、从MySQL8.0.17开始已经不推荐使用了。
5、注意:因为浮点数数不准确的,所以我们要避免使用"="来判断两个数是否相等。
4、定点数类型介绍
MySQL中的定点数类型只有Decimal一种类型
Decimal(M,D)、DEC、NUMERIC | M+2字节 | 有效范围由M和D决定 |
1、Decimal(M,D)的最大取值范围与Double类型一样,但是有效的数据范围是由M和D决定。
2、定点数在MySQL内部时以字符串的形式进行存储的,这就决定了它一定是精准的。
3、当Decimal类型不知道精度和标度的时候,其默认为Medical(10,0)。当数据的精度超出了定点数类型的精度范围的时候,MySQL同样会进行四舍五入处理。
4、浮点数VS定点数
浮点数相对于定点数的优点是在长度一定的情况下,浮点类型取值范围大,但是不精准,适用于需要取值范围大,又可以容忍小误差的科学计算场景。
定点数取值范围相对小,但是精准,没有误差,适合于对精度要求极高的场景。
5、位类型:BIT
BIT类型中存储的是二进制值,类似010110
二进制字符串类型 | 长度 | 长度范围 | 占用空间 |
---|---|---|---|
BIT(M) | M | 1<=M<=64 | 约为(M+7)/8个字节 |
BIT类型,如果没有指定(M),默认是1位,表示只能存1位的二进制。
6、日期和时间类型
1、Year类型表示年
2、Date类型表示年、月、日
3、Time类型表示时、分、秒
4、DateTime类型表示年、月、日、时、分、秒
5、TimeStamp类型表示带时区的年、月、日、时、分、秒
类型名 | 类型 | 占用字节 | 格式 | 开始时间 | 结束时间 |
---|---|---|---|---|---|
Year | 年 | 1 | YYYY或YY | 1901 | 2155 |
Time | 时间 | 3 | HH:MM:SS | -838:59:59 | 838:59:59 |
Date | 日期 | 3 | YYYY-MM-DD | 1000-01-01 | 9999-12-03 |
DateTime | 日期时间 | 8 | YYYY-MM-DD HH:MM:SS | 1000-01-01 00:00:00 | 9999-12-13 23:59:59 |
TimeStamp | 日期时间 | 4 | YYYY-MM-DD HH:MM:SS | 1970-01-0100:00:00 UTC | 2038-01-19 03:14:07UTC |
7、文本字符串类型
7.1 CHAR与VARCHAR类型
字符串(文本)类型 | 特点 | 长度 | 长度范围 | 占用的存储空间 |
---|---|---|---|---|
CHAR(M) | 固定长度 | M | 0<=M<=255 | M个字节 |
VARCAHR(M) | 可变长度 | M | 0<=M<=65535 | (实际长度+1)个字节 |
Char类型:
1、Char(M)类型一般需要预先定义字符串长度。如果不指定(M),则长度默认是一个字符。
2、如果保存时,数据的实际长度比CHAR类型声明的长度小,则会在右侧填充空格以达到指定的长度。当MySQL检索Char类型的数据时,Char类型的字段会去除尾部的空格。
3、定义CHar类型字段时,声明的字段长度即为Char类型字段所占的存储空间的字节数。
Varchar类型:
1、Varchar(M)定义时,必须指定长度M,否则报错。
2、MySQL4.0版本以下,Varchar(20):指的是20个字节,如果存放UTF8汉字时,只能存放6个汉字(每个汉字3个字节);MySQL5.0版本以上,Varchar(20)指的是20字符。
3、检索Varchar类型的字段数据时,会保留数据尾部的空格。Varchar类型的字段所占用的存储空间为字符串实际长度加一个字节。
哪些情况下使用Char或Varchar更好
类型 | 特点 | 空间上 | 时间上 | 适用场景 |
---|---|---|---|---|
Char(M) | 固定长度 | 浪费存储空间 | 效率高 | 存储不大,速度要求高 |
Varchar(M) | 可变长度 | 节省存储空间 | 效率低 | 非Char的情况 |
InnoDB存储引擎,建议使用Varchar类型。因为对于InnoDB数据表,内部的行存储格式并没有区分固定长度和可变长度列(所有数据行都使用指向数据列值的头指针),而且主要一下性能的因素是数据行使用的存储总量,由于char平均占用的空间多余Varchar,所以除了简短并且固定长度的,其他考虑Varchar。这样节省空间,对磁盘I/o和数据存储总量比较好。
7.2 Text类型
在MySQL中,Text用来保存文本类型数据,总共包含4种类型,分别为TinyInt、Text、MediumText、LongText类型。
在向Text类型的字段保存和查询数据的时候,系统自动按照实际长度存储,不需要预先定义长度。这一点和Varchar类型一样。
注意:
1、由于实际存储的长度的不确定,MySQL不允许Text类型的字段做主键。
2、如果不是特别大的内容,建议使用Char和Varchar类型来替代。
8、 ENUM类型
Enum类型也叫做枚举类型,Enum类型的取值范围需要再定义字段的时候进行指定。设置字段值的时候,Enum值类型值允许从成员选取单个值,不能一次选取多个值。
其所需要的存储空间由定义Enum类型时指定的成员个数所决定。
文本字符串类型 | 长度 | 长度范围 | 占用的存储空间 |
---|---|---|---|
Enum | L | 1<=L<=65535 | 1或2个字节 |
1、当Enum类型包含1~255个成员,需要1个字节的存储空间。
2、当Enum类型包含256~65535个成员,需要2个字节的存储空间。
3、Enum类型的成员个数的上限为65535个。
创建表如下:
Create table test_enum(season Enum('春','夏','秋','冬','unknow')
);
9、 Set类型
当Set类型包含的成员个数不同时,其所占的存储空间也是不同的。
成员个数范围(L表示实际成员个数) | 占用的存储空间 |
---|---|
1<=L<=8 | 1个字节 |
9<=L<=16 | 2个字节 |
17<=L<=24 | 3个字节 |
25<=L<=32 | 4个字节 |
33<=L<=64 | 8个字节 |
创建表如下: |
Create table test_set(s Set('A','B','C')
);
注意:
1、插入重复的Set类型成员时,MySQL会自动删除重复的成员
2、向Set类型的字段插入Set成员不存在的值的时,MySQL会抛出异常。
10、 Binary和VarBinary类型
Binary和VarBinary类似于Char和VarChar,只是它们存储的是二进制字符串。
二进制字符串类型 | 特点 | 值的长度 | 占用空间 |
---|---|---|---|
Binary(M) | 固定长度 | M(0<=M<=255) | M个字节 |
VarChar(M) | 可变长度 | M(0<=M<=65535) | M+1个字节 |
注意:VarChar必须指定M,否则会保错。
11、 BLOB类型
Blob是一个二进制大对象,可以容纳可变数量的数据。
MySQL类型包括TinyBlob、Blob、MediumBlob、LongBlob。它们可容纳值的最大长度不同,可以存储·一个二进制的大对象,比如图片、音频和视频等等。
Text和Blob的使用注意事项:
1、 BLOB和TEXT值也会引起自己的一些问题,特别是执行了大量的删除或更新操作的时候。删除这种值会在数据表中留下很大的" 空洞 ",以后填入这些"空洞"的记录可能长度不同。为了提高性能,建议定期使用 OPTIMIZE TABLE 功能对这类表进行 碎片整理 。
2、 如果需要对大文本字段进行模糊查询,MySQL 提供了 前缀索引 。但是仍然要在不必要的时候避免检索大型的BLOB或TEXT值。例如,SELECT * 查询就不是很好的想法,除非你能够确定作为约束条件的WHERE子句只会找到所需要的数据行。否则,你可能毫无目的地在网络上传输大量的值。
3、把BLOB或TEXT列 分离到单独的表 中。在某些环境中,如果把这些数据列移动到第二张数据表中,可以让你把原数据表中的数据列转换为固定长度的数据行格式,那么它就是有意义的。这会 减少主表中的碎片 ,使你得到固定长度数据行的性能优势。它还使你在主数据表上运行 SELECT * 查询的时候不会通过网络传输大量的BLOB或TEXT值。
12、 JSON类型
JSON(JavaScript Object Notation)是一种轻量级的 数据交换格式 。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。它易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。JSON 可以将 JavaScript 对象中表示的一组数据转换为字符串,然后就可以在网络或者程序之间轻松地传递这个字符串,并在需要的时候将它还原为各编程语言所支持的数据格式。