数据库开发——MySQL——数据类型——数值类型
MySQL中定义数据字段的类型对数据库的优化是非常重要的。
MySQL支持多种类型,大致可以分为四类:数值、日期/时间、字符串(字符)类型、枚举类型与集合类型。
一、数值类型
MySQL支持所有标准SQL数值数据类型。
类型 | 大小(字节) | 范围(有符号) | 范围(无符号) | 用途 |
---|---|---|---|---|
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) | 极大整数值 |
FLOAT | 4 | (-3.402 823 466 E+38,1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) | 0,(1.175 494 351 E-38,3.402 823 466 E+38) | 单精度 浮点数值 |
DOUBLE | 8 | (1.797 693 134 862 315 7 E+308,2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 双精度 浮点数值 |
DECIMAL | 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 | 依赖于M和D的值 | 依赖于M和D的值 | 小数值 |
1.整数类型
tinyint[(m)] [unsigned] [zerofill]
小整数,数据类型用于保存一些范围的整数数值范围:
有符号(默认为有符号):
-128 ~ 127
无符号:
0 ~ 255
PS: MySQL中无布尔值,使用tinyint(1)构造。
创建有符号tinyint表
create table t1(x tinyint);
desc t1;
尝试插入值
insert into t1 values(-129);
insert into t1 values(-128);
insert into t1 values(127);
insert into t1 values(128);
查看表中数据
select * from t1;
创建无符号tinyint表
create table t2(x tinyint unsigned);
尝试插入值
insert into t2 values(-1);
insert into t2 values(0);
insert into t2 values(255);
insert into t2 values(256);
查看表中数据
select * from t2;
int[(m)][unsigned][zerofill]
整数,数据类型用于保存一些范围的整数数值范围:
有符号(默认为有符号):
-2147483648 ~ 2147483647
无符号:
0 ~ 4294967295
创建无符号int表
create table t3(x int);
尝试插入值
insert into t3 values(-2147483649);
insert into t3 values(-2147483648);
insert into t3 values(2147483647);
insert into t3 values(2147483648);
查看表中数据
select * from t3;
创建有符号int表
create table t4(x int unsigned);
尝试插入值
insert into t4 values(-1);
insert into t4 values(0);
insert into t4 values(4294967295);
insert into t4 values(4294967296);
查看表中数据
select * from t4;
bigint[(m)][unsigned][zerofill]
大整数,数据类型用于保存一些范围的整数数值范围:
有符号:
-9223372036854775808 ~ 9223372036854775807
无符号:
0 ~ 18446744073709551615
创建无符号bigint表
create table t5(x bigint);
尝试插入值
insert into t5 values(-9223372036854775809);
insert into t5 values(-9223372036854775808);
insert into t5 values(9223372036854775807);
insert into t5 values(9223372036854775808);
查看表中数据
select * from t5;
创建有符号bigint表
create table t6(x bigint unsigned);
尝试插入值
insert into t6 values(-1);
insert into t6 values(0);
insert into t6 values(18446744073709551615);
insert into t6 values(18446744073709551616);
查看表中数据
select * from t6;
2.浮点型
FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]
定义:
单精度浮点数(非准确小数值),m是数字总个数,d是小数点后个数。m最大值为255,d最大值为30
有符号:
-3.402823466E+38 to -1.175494351E-38,
1.175494351E-38 to 3.402823466E+38
无符号:
1.175494351E-38 to 3.402823466E+38
精确度:
**** 随着小数的增多,精度变得不准确 ****
.
创建有符号float表
create table t7(x float(255,30));
尝试插入π小数点后70位
insert into t7 values(3.1415926535897932384626433832795028841971693993751058209749445923078164);
查看表中数据
select * from t7;
随着小数的增多,精度开始不准确
DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]
定义:
双精度浮点数(非准确小数值),m是数字总个数,d是小数点后个数。m最大值为255,d最大值为30
有符号:
-1.7976931348623157E+308 to -2.2250738585072014E-308
2.2250738585072014E-308 to 1.7976931348623157E+308
无符号:
2.2250738585072014E-308 to 1.7976931348623157E+308
精确度:
****随着小数的增多,精度比float要高,但也会变得不准确 ****
创建有符号double表
create table t8(x double(255,30));
尝试插入π小数点后70位
insert into t8 values(3.1415926535897932384626433832795028841971693993751058209749445923078164);
查看表中数据
select * from t8;
精度比float要准确点,但随着小数的增多,同样变得不准确
decimal[(m[,d])] [unsigned] [zerofill]
定义:
准确的小数值,m是数字总个数(负号不算),d是小数点后个数。 m最大值为65,d最大值为30。
精确度:
**** 随着小数的增多,精度始终准确 ****
对于精确数值计算时需要用此类型
decaimal能够存储精确值的原因在于其内部按照字符串存储。
创建有符号decimal表
create table t9(x decimal(65,30));
尝试插入π小数点后70位
insert into t9 values(3.1415926535897932384626433832795028841971693993751058209749445923078164);
查看表中数据
select * from t9;
精度始终准确,d为30,于是只留了30位小数
用zerofill测试整数类型的显示宽度
注意:为该类型指定宽度时,仅仅只是指定查询结果的显示宽度,与存储范围无关。
完全没必要为整数类型指定显示宽度,使用默认的就可以了。
默认的显示宽度,都是在最大值的基础上加1。
创建指定zerofill的有符号int表
create table t10(x int(5) zerofill);
尝试插入不同长度的数值
insert into t10 values
(1),
(11),
(111),
(1111),
(11111),
(111111),
(1111111),
(11111111);
查看表中数据
select * from t10;