数据类型
数值类型
类型 | 大小 | 范围(有符号) | 范围(无符号) |
---|---|---|---|
TINYINT | 1 字节 | -128 ~ 127 | 0 ~ 255 |
SMALLINT | 2 字节 | -32768 ~ 32767 | 0 ~ 65535 |
MEDIUMINT | 3 字节 | -8388608 ~ 8388607 | 0 ~ 16777215 |
INT | 4 字节 | -2147483648 ~ 2147483647 | 0 ~ 4294967295 |
BIGINT | 8 字节 | -2^63 ~ 2^63-1 | 0 ~ 18446744073709551615 |
FLOAT | 4 字节 | – | – |
DOUBLE | 8 字节 | – | – |
DECIMAL[(M,D)] | M+2/D+2 | M:总位数,D:小数点位数 | 依赖 M 和 D 的值 |
字符串类型
类型 | 存储范围 | 用途 |
---|---|---|
CHAR(M) | M 字节,其中 M 为 0 ~ 255 | 定长字符串 |
VARCHAR(M) | L + 1 字节,0 ~ 255 | 变长字符串 |
TINYTEXT | – | – |
TEXT | L + 2 字节,0 ~ 65535 | 文章等文本数据 |
MIUDMTEXT | – | – |
LONGTEXT | – | – |
BLOB | 0 ~ 65535 | 图片等二进制形式数据 |
MIUDMBLOB | – | – |
LONGBLOB | – | – |
ENUM(‘val’,’val’) | 1 或 2 字节,取决于枚举的个数 | – |
SET(‘val’,’val’,’val’) | 1, 2, 3, 4, 8 字节,取决于成员的数目 | – |
时间类型
类型 | 大小 | 范围 | 格式 | 用途 |
---|---|---|---|---|
DATE | 3 字节 | 1000-01-01~9999-12-31 | YYYY-MM-DD | 日期值 |
TIME | 3 字节 | -838:59:59/838:59:59 | HH:MM:SS | 时间值 |
YEAR | 1 字节 | 1901/2155 | YYYY | 年份值 |
DATETIME | 8 字节 | 1000-01-01 00:00:00/9999 | YYYY-MM-DD HH:MM:SS | 日期和时间值 |
TIMESTAMP | 4 字节 | 1970-01-01 00:00:00/2038 | YYYYMMDD HHMMSS | 日期和时间值 |
选择
原则
- 选择合理范围内最小的,这样可以大大减少磁盘空间及磁盘 I/0 读写开销,减少内存占用,减少 CPU 占用率。
- 选择相对简单的数据类型,数字类型相对字符串类型要简单的多。
- 尽量避免 NULL,这是因为 MySQL 对 NULL 字段索引优化不佳,解决方法是数值弄用整数 0,字符串用空来定义默认值即可。
示例
- 手机号:char(11)
- 姓名:char(20)
- 价格:decimal(7, 3)
- 产品序列号:smallint(5) unsigned
- 文章内容: text
- MD5: char(32)
- IP: char(15)
- Email:char(32)
- 性别:enum(‘男’,’女’)
- 布尔值:tinyint(1)