1.整数
类型 |
范围 |
存储大小 |
tinyint |
-128 ~ 127 |
1字节 |
tinyint unsigned |
0 ~ 255 |
1字节 |
smallint |
-32768 ~ 32767 |
2字节 |
smallint unsigned |
0 ~ 65535 |
2字节 |
int |
-2147483648 ~ 2147483647 |
4字节 |
int unsigned |
0 ~ 4294967295 |
4字节 |
bigint |
-9223372036854775808 ~ 9223372036854775807 |
8字节 |
bigint unsigned |
0 ~ 18446744073709551615 |
8字节 |
- 整数类型后接数字仅代表显示宽度,不代表存储长度。如 int(4) 与 int(10) 一致,固定存储为4字节,故建表语句中不必填写
- 用作表主键时应该选用
int unsigned
或者 bigint unsigned
create table `example1` (
`id` int unsigned NOT NULL AUTO_INCREMENT COMMENT '自增id',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='示例1';
--
create table `example2` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '自增id',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='示例2';
- 使用整数代替枚举类
enum
能获取更高的效率,建议选用 tinyint
或者 tinyint unsigned
create table `example3` (
`id` int unsigned NOT NULL AUTO_INCREMENT COMMENT '自增id',
`sex` tinyint unsigned NOT NULL DEFAULT 0 COMMENT '性别:0-女 1-男',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='示例3';
- 计算机处理整数类型比字符串类型快,故存储IPV4地址时候可使用
int unsigned
,通过inet_ntoa和inet_aton进行转化
create table `example4` (
`id` int unsigned NOT NULL AUTO_INCREMENT COMMENT '自增id',
`ip_addr` tinyint unsigned NOT NULL DEFAULT 0 COMMENT 'ipv4地址',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='示例4';
select inet_aton('209.207.224.40'); --3520061480
select inet_ntoa('3520061480'); --209.207.224.40
2.小数
类型 |
范围 |
存储 |
特点 |
float(M, D) |
M表示位宽,D是小数点后位数 |
4字节 |
浮点数-保存近似值 |
double(M, D) |
M表示位宽,D是小数点后位数 |
8字节 |
浮点数-保存近似值 |
decimal(M, D) |
M表示总位数,D是小数点后位数 |
M+2字节 |
定点数-以字符串型式保存数值 |
- 建议小数统一使用 decimal ,尤其是与货币、金融相关的数据
create table `example5` (
`id` int unsigned NOT NULL AUTO_INCREMENT COMMENT '自增id',
`price` decimal(10,2) NOT NULL DEFAULT 0 COMMENT '价格',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='示例5';
3.字符串
类型 |
范围 |
存储 |
char(n) |
n个字符(非字节) |
固定存储长度 |
varchar(n) |
n个字符(非字节) |
字符串实际长度加上用于记录长度的字节 |
- 实际取值为定长时应选用
char(n)
- 变长字符串
varchar(n)
存在用于记录长度的字节,故字符串长度<=255时仅需1字节记录长度 varchar(255)
- 不要对过长的 varchar 建立索引
- **重要: varchar 字段为 null 时无法使用索引,应使用 not null 定义并将默认值设为空串 **
create table `example6` (
`id` int unsigned NOT NULL AUTO_INCREMENT COMMENT '自增id',
`remark` varchar(255) NOT NULL DEFAULT '' COMMENT '备注',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='示例6';
4.日期时间
类型 |
范围 |
存储大小 |
说明 |
year |
1901 ~ 2155 |
1字节 |
年份 |
date |
1000-01-01 ~ 9999-12-31 |
3字节 |
日期 |
time |
-838:59:59 ~ 838:59:59 |
3字节 |
时间 |
timestamp |
1970-01-01 00:00:00~ 2037年 |
4字节 |
日期时间 |
datetime |
1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 |
8字节 |
日期时间 |
- 使用 timestamp 时可设置自动初始化和自动更新
create table `example7` (
`id` int unsigned NOT NULL AUTO_INCREMENT COMMENT '自增id',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间'
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='示例7';