mysql使用--数据类型

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.当MW<256时,需1字节来表示占用的字节数。此时VARCHAR(M)需L+1字节。
_2.2.2.当M
W>=256时,需2字节来表示占用的字节数。此时VARCHAR(M)需L+2字节。

_3.各种TEXT类型
除VARCHAR(4)外,还有TINYTEXT,TEXT,MEDIUMTEXT,LONGTEXT这四种可存储可变长度的字符串类型。这些类型占用的存储空间也由实际内容和内容占用的字节长度两部分构成。
_3.1.TINYTEXT:最多可存储2^8-1字节的字符串,内容占用的字节长度用1字节表示。
_3.2.TEXT:最多可存储2^16-1字节,内容占用的字节长度用2字节表示。
_3.3.MEDIUMTEXT:最多可存储2^24-1字节,内容占用的字节长度用3字节表示。
_3.4.LONGTEXT:最多可存储2^32-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类型是用来存储字符的。

你可能感兴趣的:(5.2.数据库--MySql,mysql,数据类型)