1.整型类型
类型 | 尺寸 |
---|---|
TINYINT | 1 |
SMALLINT | 2 |
MEDIUMINT | 3 |
INT或INTEGER | 4 |
BIGINT | 8 |
1.1.在数据类型后加上UNSIGNED
构成无符号类型。
1.2.在数据类型后加上SIGNED
,或什么都不加构成有符号数。
2.浮点数类型
类型 | 尺寸 |
---|---|
FLOAT | 4 |
DOUBLE | 8 |
3.定点数类型
引入背景是,浮点数表示小数是不精确的。某些情况下,必须保证存储的小数是精确的,此时可用定点数类型来存储小数。
类型 | 尺寸 |
---|---|
DECIMAL(M, D) | 取决于M和D |
3.1.对于一个定点数形式,D
规定了小数点后数字个数,M-D
也就规定了整数部分数字个数最大值。比如DECIMAL(4,2)
定点数只能表示[-99.99, 99.99]
范围内的小数。
3.2.DECIMAL(M, D)
数据存储方案细节。以DECIMAL(16, 4)
为例。
3.2.1.将小数看做由小数点左边,右边两个整数组成。从小数点位置出发,将每个整数每隔9
个十进制位划分为一组。这样,整数部分高3
位一组,低9
位一组,小数部分4
位一组。
3.2.2.每组的十进制数字转换为二进制存储。十进制数字位数及所分配存储空间见表:
位数 | 尺寸 |
---|---|
1~2 | 1字节 |
3~4 | 2字节 |
5~6 | 3字节 |
7~9 | 4字节 |
3.2.3.将各组二进制有序拼接。将起始组二进制最高位设置为1
。
以DECIMAL(16, 4)
的实例1234567890.1234
为例:
1 | 234567890 | 1234 |
---|---|---|
0x0001 | 0x0DFB3BD2 | 0x04D2 |
组合后,起始组二进制最高位设置为1
后为0x80010DFB3BD204D2
,相应的占据尺寸为8
字节。
存储负数场景时,先得到关联正数存储内容,再对每个二进制位执行按位取反即可。如DECIMAL(16, 4)
的实例-1234567890.1234
将以0x7FFEF204C72DFB2B
存储。
4.日期和时间类型
类型 | 尺寸 | 范围 |
---|---|---|
YEAR | 1 | 1901~2155 |
DATE | 3 | ‘1000-01-01’~‘9999-12-31’ |
TIME | 3 | ‘-838:59:59’~‘838:59:59’ |
DATETIME | 8 | ‘1000-01-01 00:00:00’~‘9999-12-31 23:59:59’ |
TIMESTAMP | 4 | ‘1970-01-01 00:00:01’~‘2038-01-19 03:14:07’ |
MYSQL 5.6.4
版本之后,TIME,DATETIME,TIMESTAMP
支持精度最多到微妙。相应尺寸,存储方案略有调整。
TIME
可以为负数,是因为它不仅可以表示一天中的某个时间,还可表示两个时间间的间隔。
我们把从0
号时区的1970-01-01 00:00:00
开始到现在所经历的秒数称为时间戳。用TIMESTAMP
存储时间的好处是,它展示的值可随着时区的变化而变化。举例来说,我们当前在东八区,当前日期和时间'2023-11-12 19:48:10'
存储到TIMESTAMP
,如果将系统的时区信息调整为东九区,则看到的时间会变成'2023-11-12 20:48:10'
。
5.字符串类型
5.1.字符编码
字符是面向人的概念,字节是面向计算机的概念。想在计算机中表示字符,就需将该字符与一个特定的字节序列对应起来,这个映射过程叫编码。这种映射有很多种,每种即一个编码方案。按一个字符使用字节数量是否固定,编码方案可分为:
a.固定长度编码方案
b.可变长度的编码方案
在MYSQL
中字符集就是编码方案,常用的有UFT-8
,GB2312
。
正宗的utf-8使用1~4字节来编码一个字符,mysql中uft-8字符集一个字符最多用3字节。某些场景需使用4字节来编码字符,可使用一种叫utf8mb4的字符集,它才是正宗的utf-8字符集。
5.2.MYSQL
的字符串类型
_1.CHAR(M)
M
代表该类型最多可存储的字符数量。M
取值范围是0~255
。默认1
。CHAR(0)
只能存储空字符串’'或NULL
值。
使用该类型时,实际存储字符不足M
个时,后续用空格字符填充。
_2.VARCHAR(M)
M代表该类型最多可存储的字符数量。理论上的取值范围是1~65535
。MYSQL
规定表的一行数据(可能由多列构成)占用的存储空间总共不得超过65535
字节,这时,VARCHAR(M)
实际无法存储65535
个字符。
VARCHAR(M)
所对应的存储空间其实由下面两部分组成。
_2.1.真正的字符串内容
假设真正的字符串在指定字符集编码后占用字节数为L
_2.2.占用的字节数
假定VARCHAR(M)
采用的字符集编码下一个字符至多需W
个字节,则:
_2.2.1.当M*W<256
时,需1
字节来表示占用的字节数。此时VARCHAR(M)
需L+1
字节。
_2.2.2.当M*W>=256
时,需2
字节来表示占用的字节数。此时VARCHAR(M)
需L+2
字节。
_3.各种TEXT
类型
除VARCHAR(M)
外,还有TINYTEXT,TEXT,MEDIUMTEXT,LONGTEXT
这四种可存储可变长度的字符串类型。这些类型占用的存储空间也由实际内容和内容占用的字节长度两部分构成。
_3.1.TINYTEXT
:最多可存储
2
8
−
1
2^{8}-1
28−1字节的字符串,内容占用的字节长度用1
字节表示。
_3.2.TEXT
:最多可存储
2
16
−
1
2^{16}-1
216−1字节,内容占用的字节长度用2
字节表示。
_3.3.MEDIUMTEXT
:最多可存储
2
24
−
1
2^{24}-1
224−1字节,内容占用的字节长度用3
字节表示。
_3.4.LONGTEXT
:最多可存储
2
32
−
1
2^{32}-1
232−1字节,内容占用的字节长度用4
字节表示。
前面说的表的一行数据(可能由多列构成)占用的存储空间总共不得超过65535
字节,这个规定对这些TEXT
类型无效。
_4.ENUM
类型和SET
类型
枚举类型,如ENUM('男', '女')
。
对于使用ENUM
类型的列,该列的值只能在给定的字符串列表中选择其中的一个。
有的时候,某一列的值可以在给定的字符串列表中挑选多个。此时使用SET
类型。
SET
类型,如SET('str1', 'str2', 'str3')
对使用SET
类型的列,该列的值可在给定的字符串列表中选择一个或多个。
综上所述,ENUM
和SET
类型都是一种特殊的字符串类型,在从字符串列表中单选或多选元素的时候会用得到他们。
6.二进制类型
6.1.BIT
类型
BIT(M)
,其中M
的取值范围为1~64
,默认为1
。
一个字节拥有8
比特位。如果我们想存储的比特数不足整数个字节,则MYSQL
会偷偷地填充满,比方说:
_1.BIT(1)
只需存储1
比特的数据,但MYSQL
为其申请(1+7)/8=1
个字节。
_2.BIT(9)
,2
个字节。
6.2.BINARY(M)
与VARBINARY(M)
BINARY(M)
和VARBINARY(M)
对应于前面提到的CHAR(M)
和VARCHAR(M)
,不过BINARY
,VARBINARY
是用来存放字节的,其中M
代表该类型最多能存放的字节数量,而CHAR
,VARCHAR
是用来存储字符的 ,其M
代表该类型最多能存放的字符数量。
6.3.BLOB
TINYBLOB,BLOB,MEDIUMBLOB,LONGBLOB
用于存储可变长度的二进制数据,比如图片,音频,压缩文件等。他们很像TINYTEXT,TEXT,MEDIUMTEXT,LONGTEXT
,不过各种BLOB
类型是用来存储字节的,而各种TEXT
类型是用来存储字符的。