MySQL的列(字段)类型(二)

列(字段)类型基本分三种

  • 数值
  • 日期和时间
  • 字符串类

数值

类型名称 有符号(自然数) 无符号(正数) 占用空间(字节)
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字符使用相同的字节数。