MySQL表ID字段选择整型还是字符型?
回答这个问题,先了解下整型跟字符型的存储
MySQL字符类型
类型 | 占用字节 | 表示范围 |
---|---|---|
CHAR(M) | 与字符集相关(单行不能超过65535个字节) | 1 <= M <= 255 |
VARCHAR(M) | 与字符集相关(单行不能超过65535个字节) | 1 <= M <= 255 |
TINYBLOB, TINYTEXT | L+1 字节 | L< 2 ^ 8(255B) |
BLOB, TEXT | L+2 字节 | L< 2 ^ 16(64K) |
MEDIUMBLOB, MEDIUMTEXT | L+3 字节 | L< 2 ^ 24(16M) |
LONGBLOB, LONGTEXT | L+4 字节 | L< 2 ^ 32(4G) |
ENUM('value1','value2',...) | 1 或 2 个字节, 取决于枚举值的数目(最大值65535) | |
SET('value1','value2',...) | 1,2,3,4或8个字节, 取决于集合成员的数量(最多64个成员) |
MySQL数值类型
类型 | 占用字节 | 表示范围 |
---|---|---|
TINYINT | 1个字节 | -128~127 |
SMALLINT | 2个字节 | -32768~32767 |
MEDIUMINT | 3个字节 | -8388608~8388607 |
INT | 4个字节 | -2147483648~2147483647 |
BIGINT | 8个字节 | -9223372036854775808~9223372036854775807 |
FLOAT(X) | 4(X < = 24) 或 8( 25 < = X < = 53 ) | |
FLOAT | 4 个字节 | |
DOUBLE | 8 个字节 | |
DOUBLE PRECISION | 8 个字节 | |
REAL | 8 个字节 | |
DECIMAL(M,D) | M字节(D+2 , 如果M < D) | |
NUMERIC(M,D) | M字节(D+2 , 如果M < D) |
日期和时间类型
DATE 3 个字节
DATETIME 8 个字节
TIMESTAMP 4 个字节
TIME 3 个字节
YEAR 1 字节
存储不同字符集占用的字节不同
UTF-8:一个汉字 = 3个字节,英文是一个字节
UTF8mb4:兼容utf8,且比utf8能表示更多的字符,支持4个字节
GBK: 一个汉字 = 2个字节,英文是一个字节
文章开始疑问的答案
根据上面信息的了解可以得出,要存储 ID = 1000000
选择数值型: 4字节
选择字符型: 7字节
毫无疑问,数值型占用更小的存储空间,性能也必须优于字符型。