文章目录
1、MySQL的字段类型
- MySQL列类型就是MySQL的数据类型
1.1、数值类型
1字节是8bit。
- BIT(M):位类型,M指定位数,默认值为1,范围是1-64。
- TINYINT[UNSIGNED]:
占1个字节
,带符号范围是[-128,127],不带符号的是[0,255],默认是带符号的。 - SMALLINT[UNSIGNED]:
占2个字节
,带符号范围是[-2^15,2^15-1
],不带符号的是[0,2^16-1
] - MEDIUMINT[UNSIGNED]:占3个字节,带符号范围是[
-2^23,2^23-1
],不带符号的是[0,2^24-1
] - INT[UNSIGNED]:
占4个字节
,带符号范围是[-2^31,2^31-1
],不带符号的是[0,2^32-1
] - BIGINT[UNSIGNED]:
占8个字节
,带符号范围是[-2^63,2^63-1
],不带符号的是[0,2^64-1
] - FLOAT[UNSIGNED]:
占4个字节
。 - DOUBLE[UNSIGNED]:
占8个字节
。 - DECIMAL(M,D)[UNSIGNED]:定点数,M指定长度,D表示小数点的位数。
1.4、文本类型
- CHAR(size),固定长度字符串,最大是255。
- VARCHAR(size),可变长度字符串范围在[
0,2^16-1
]。
char(n)和varchar(n)中的n表示
字符
的个数,不代表字节个数。
- TEXT:范围是[
0,2^16
]。 - LONG TEXT:范围是[
0,2^32
]。
在不同编码
1.5、二进制数据类型
- BLOB:范围是[
0,2^16
]。 - LONG BLOB:范围是[
0,2^32
]。
1.6、日期类型
- DATE
- DATETIME
- TimeStamp
2、varchar长度设置
2.1、结论
- 结论:varchar长度需要多长就设置为多长,不必考虑2的幂。如果遇到varchar(256)的时候,那么何必不选择varchar(255),这样还能节省1个存储长度的字节。
2.2、varchar(n)的最大值字符数
- varchar(size)是保存多少个字符,而不是字节。
- varchar最大是可以保存65535字节,但是根据不同编码,才能决定具体保存多少个字符。
- 如果是utf8格式,无论数字、字母还是汉子,都可以存放n个。varchar(20),那么就是可以保存20个汉子。
4.1. 如果是gbk,varchar(n)中每个字符最多占2个字节,长度不能超过(65535 - 3 / 2)。
4.2. 如果是utf-8,varchar(n)中每个字符最多占3个字节,长度不能超过(65535 - 3 / 3)。
2.3、varchar(n)需要1-2个额外字节记录长度n的值
- 当n <= 255的时候,只需要1个字节记录(数据表示范围:0 ~ (2^8-1),即0~255;当n > 255的时候,那么需要2个字节存储n的值(
(2^8)
~(2^16)-1
,即256~65535)。 - 那么varchar保存的实际值的长度保存在第一个或者前两个字节中。
a.如果varchar(20),实际是需要1+20个字节的存储空间;
b.如果varchar(255),实际是需要1+255个字节的存储空间;
c.如果varchar(256),实际是需要2+256个字节的存储空间;
d.如果varchar(500),实际是需要2+500个字节的存储空间.
2.4 关于内存对齐的问题
- (
2^n - 1
)是不能达到内存对其的目的,因为varchar长度是以实际保存的字符串长度
为准的。另外,InnoDB是以page
为基本的存储单位
,一页要么有一行要么有多行数据,数据的读取是基于page的
,而不是按照行读取的。