列(字段)类型基本分三种
- 数值
- 日期和时间
- 字符串类
数值
类型名称 | 有符号(自然数) | 无符号(正数) | 占用空间(字节) |
---|---|---|---|
TINYINT | -128 至 127 | 0 至 255 | 1byte |
SMALLINT | -32768 至 32767 | 0 至 65535 | 2byte |
MEDIUMINT | -8388608 至 8388607 | 0 至 16777215 | 3byte |
INT | -2147483648 至 2147483647 | 0 至 4294967295 | 4byte |
BIGINT | -9223372036854775808 至 9223372036854775807 | 0 至 18446744073709551615 | 8byte |
数值型存储需求
类型 | 大小 |
---|---|
TINYINT | 1字节 |
SMALLINT | 2字节 |
MEDIUMINT | 3字节 |
INT, INTEGER | 4字节 |
BIGINT | 8字节 |
FLOAT(p) | 如果0 <= p <= 24为4个字节, 如果25 <= p <= 53为8个字节 |
DOUBLE [PRECISION], item REAL | 8字节 |
DECIMAL(M,D), NUMERIC(M,D) | 变长 |
BIT(M) | 大约(M+7)/8个字节 |
DECIMAL(和NUMERIC)的存储需求与具体版本有关:
使用二进制格式将9个十进制(基于10)数压缩为4个字节来表示DECIMAL列值。每个值的整数和分数部分的存储分别确定。每个9位数的倍数需要4个字节,并且“剩余的”位需要4个字节的一部分。
日期和时间类型的存储需求
类型 | 大小 |
---|---|
DATE | 3字节 |
DATETIME | 8字节 |
TIMESTAMP | 4字节 |
TIME | 3字节 |
YEAR | 1字节 |
字符串类型的存储需求
类型 | 大小 |
---|---|
CHAR(M) | M个字节,0 <= M <= 255 |
VARCHAR(M) | L+1个字节,其中L <= M 且0 <= M <= 65535 |
BINARY(M) | M个字节,0 <= M <= 255 |
VARBINARY(M) | L+1个字节,其中L <= M 且0 <= M <= 255 |
TINYBLOB, TINYTEXT | L+1个字节,其中L < 2的8次方 |
BLOB, TEXT | L+2个字节,其中L < 2的16次方 |
MEDIUMBLOB, MEDIUMTEXT | L+3个字节,其中L < 2的24次方 |
LONGBLOB, LONGTEXT | L+4个字节,其中L < 2的32次方 |
ENUM(‘value1′,’value2’,…) | 1或2个字节,取决于枚举值的个数(最多65,535个值) |
SET(‘value1′,’value2’,…) | 1、2、3、4或者8个字节,取决于set成员的数目(最多64个成员) |
VARCHAR、BLOB和TEXT类是变长类型。每个类型的存储需求取决于列值的实际长度(用前面的表中的L表示),而不是该类型的最大可能的大小。例如,VARCHAR(10)列可以容纳最大长度为10的字符串。实际存储需求是字符串(L)的长度,加上一个记录字符串长度的字节。对于字符串’abcd’,L是4,存储需要5个字节。
对于CHAR、VARCHAR和TEXT类型,前面的表中的值L和M应解释为字符数目,并且列定义中的这些类型的长度表示字符数目。例如,要想保存一个TINYTEXT值需要L字符+ 1个字节。
要想计算用于保存具体CHAR、VARCHAR或者TEXT列值的字节数,需要考虑该列使用的字符集。在具体情况中,当使用Unicode时,必须记住所有Unicode字符使用相同的字节数。