整型
TINYINT 1 字节 (-128,127) (0,255) 小整数值
SMALLINT 2 字节 (-32 768,32 767) (0,65 535) 大整数值
MEDIUMINT 3 字节 (-8 388 608,8 388 607) (0,16 777 215) 大整数值
INT或INTEGER 4 字节 (-2 147 483 648,2 147 483 647) (0,4 294 967 295) 大整数值
BIGINT 8 字节 (-9 233 372 036 854 775 808,9 223 372 036 854 775 807) (0,18 446 744 073 709 551 615) 极大整数值
注意点:
- 和编程开发中的整型一样, 也区分有符号的整型和无符号的整型 unsigned, 默认就是有符号, 如果是无符号, 那么取值范围*2
- 在企业开发中也和编程开发中, 每一个字段最好使用合适的类型
+ 例如存储人的年龄, 就不要使用INT,
- 通过desc看到的数据类型后面的数值并不是占用的存储空间大小, 而是二printf一样,是位宽
+ 例如: tinyint(4) 显示的宽度是4
+ 默认宽度不会自动填充, 如果想自动填充, 必须加上zerofill
- 如果存储的值超出了取值范围, 那么会报错
示例一:
create table if not exists stu1(
id int auto_increment primary key,
score TINYINT
);
insert into stu1 values(null, 127); #不会报错
insert into stu1 values(null, 128); #会报错
示例二:
create table if not exists stu2(
id int auto_increment primary key,
score TINYINT unsigned
);
insert into stu2 values(null, 128); #不会报错
insert into stu2 values(null, 255); #不会报错
insert into stu2 values(null, 256); #不会报错
示例三:
create table if not exists stu3(
id int auto_increment primary key,
score TINYINT
);
insert into stu3 values(null, 1);
create table if not exists stu4(
id int auto_increment primary key,
score TINYINT(2) ZEROFILL
);
insert into stu4 values(null, 1);
insert into stu4 values(null, 12);
insert into stu4 values(null, 123);
浮点类型
- FLOAT(m, d) 4 字节 单精度
- DOUBLE(m, d) 8 字节 双精度
- m总位数, d小数位数
float和double的区别
+ 和编程开发中一样, 默认保留的小数位数不同
+ 和编程开发中一样, 有效精度也不同
+ 和编程开发中一样, 浮点类型是不准确的
+ 所以在企业开发中千万不要使用浮点数来保存用户的准确(珍贵)信息(RMB)
示例一:
create table if not exists stu5(
id int auto_increment primary key,
score FLOAT,
height DOUBLE
);
insert into stu5 values(null, 1.12345678901234567890, 1.12345678901234567890);
示例二:
create table if not exists stu6(
id int auto_increment primary key,
score FLOAT(3,2),
height DOUBLE(3,2)
);
insert into stu6 values(null, 1.12345678901234567890, 1.12345678901234567890);
示例三: 丢失精度
create table if not exists stu7(
id int auto_increment primary key,
score FLOAT(20,19),
height DOUBLE(20,19)
);
insert into stu7 values(null, 1.12345678901234567890, 1.12345678901234567890);
定点类型
- decimal(M, D), m总位数, d小数位数
- 定点类型的本质:
是将数据分为两个部分来存储, 每个部分都是整数, 所以定点数不要滥用, 因为非常消耗资源
示例三: 丢失精度
create table if not exists stu8(
id int auto_increment primary key,
score decimal(30,29),
height decimal(30,29)
);
insert into stu8 values(null, 1.12345678901234567890666, 1.12345678901234567890666);
+----+---------------------------------+---------------------------------+
| id | score | height |
+----+---------------------------------+---------------------------------+
| 1 | 1.12345678901234567890666000000 | 1.12345678901234567890666000000 |
+----+---------------------------------+---------------------------------+
字符类型
- CHAR(size) 0-255字节 定长字符串
- VARCHAR(size) 0-65535 字节 变长字符串
注意点: 由于是字符类型, 所以传递值只能用单引号''
char(2) 和 varchar(2)的区别:
- 它们最多都只能保存2个字符
- char(2)不会回收多余的字符, 指定多少个就给我们多少个
- varchar(2)会回收多余的字符, 用多少给多少
- 由于char(2)不会回收多余的字符, 所以效率高
- 由于varchar(2)会回收多余的字符, 所以效率相对低一些
示例一:
create table if not exists stu9(
id int auto_increment primary key,
name1 char(2),
name2 varchar(2)
);
insert into stu9 values(null, 'ab', 'de');
insert into stu9 values(null, '1', '2');
insert into stu9 values(null, '123', '234'); #超出范围就会报错
示例二:
如果没有指定长度, 那么默认char就是255,varchar65535
create table if not exists stu10(
id int auto_increment primary key,
name char(255)
);
注意点: 理论上varchar最多能够存储65535个字符, 但是实际的大小和表的编码方式有关
create table if not exists stu11(
id int auto_increment primary key,
name varchar(65535)
)charset=gbk;
如果表的编码方式是UTF-8, 那么最多能够存储65535/3
Column length too big for column 'name' (max = 21845); use BLOB or TEXT instead
如果表的编码方式是GBK, 那么最多能够存储65535/2
Column length too big for column 'name' (max = 32767); use BLOB or TEXT instead
-->