一、介绍
存储引擎决定了表的类型,而表内存放的数据也要有不同的类型,每种数据类型都有自己的宽度,但宽度是可选的。
mysql常用数据类型概览
#1、数字; 整型:tinyinit 、int 、bigint 小数: float:在位数比较短的情况下不精准 double:在位数比较长的情况下不精准 0.000001230123123123 存成:0.000001230000 decimal:(如果用小数,则推荐使用decimal) 精准 内部原理是以字符串形式去存 #2、字符串 char(10):简单粗暴,浪费空间,存取速度快 root存成root000000 varchar:精准,节省空间,存取速度慢 sql优化:创建表时,定长的类型往前放,变长的往后防 比如性别 例如地址或描述信息 >255个字符,超过了就把文件路径存放到数据库中。 比如图片,视频等找一个文件服务器,数据库中只存路径或url #3、时间类型: 最常用:datetime #4、枚举类型与集合类型
二、数值类型
1、整数类型
整数类型:tinyint / smallint / mediumint / int / bigint
作用:存储年龄,等级,id,各种号码等
=========================================== tinint [(m)] [unsigned] [zerofill] 小整数,数据类型用于保存一些范围的整数数值范围: 有符号:-128~127 无符号:0~255 PS:MySQL中无布尔值,使用tinyint(1)构造。 =========================================== int[(m)] [unsigned] [zerofill] 整数,数据类型用于保存一些范围的整数数值范围: 有符号:-2147483648~2147483647 无符号:0`4294967295 =========================================== bigint [(m)] [unsigned] [zerofill] 大整数,数据类型用于保存一些范围的整数数值范围: 有符号:-9223372036854775808~9223372036854775808 无符号:0~18446744073709551615
===================有符号和无符号tinyint=============== #tinyint 默认为有符号 create table t1(x tinyint); #默认为有符号,即数字前有正负号 desc t1; insert into t1 values(-129),(-128),(127),(128); select * from t1; +------+ | x | +------+ | -128 | #-129存成了-128 | -128 | #有符号,最小值为-128 | 127 | #有符号,最大值127 | 127 | #128存成了127 +------+ #设置无符号tinyint create table t2(x tinyint unsigned); insert into t2 values(-1),(0),(255),(256); select * from t2; +------+ | x | +------+ | 0 | -1存成了0 | 0 | #无符号,最小值为0 | 255 | #无符号,最大值为255 | 255 | #256存成了255 +------+ =================有符号和无符号int================== #int 默认为有符号 create table t3(x,int); #默认为有符号整数 insert into t3 values(-2147483649),(-2147483648),(2147483647),(2147483648); select * from t3; +-------------+ | x | +-------------+ | -2147483648 | #-2147483649存成了-2147483648 | -2147483648 | #有符号,最小值为-2147483648 | 2147483647 | #有符号,最大值为2147483647 | 2147483647 | #2147483648存成了2147483647 +-------------+ #设置无符号int create table t4(x int unsigned); insert into t4 values(-1),(0),(4294967295),(4294967296); select * from t4; +------------+ | x | +------------+ | 0 | #-1存成了0 | 0 | #无符号,最小值为0 | 4294967295 | #无符号,最大值为4294967295 | 4294967295 | #4294967296存成了4294967295 +------------+ ===================有符号和无符号bigint================== # 设置有符号bigint create table t6(x bigint); insert into t5 values(-9223372036854775809),(-9223372036854775808),(9223372036854775807),(9223372036854775808); select * from t5; +-------------------------------+ | x | +-------------------------------+ | -9223372036854775808 | | -9223372036854775808 | | 9223372036854775807 | | 9223372036854775807 | +--------------------------------+ #设置无符号bigint create table t6(x bigint unsigned); insert into t6 values(-1),(0),(18446744073709551615),(18446744073709551616); select * from t6; +--------------------------------+ | x | +---------------------------------+ | 0 | | 0 | | 18446744073709551615 | | 18446744073709551615 | +--------------------------------+ ===================用zerofill测试整数类型的显示宽度================ create table t7(x int(3) zerofill); insert into t7 values(1),(11),(111),(1111); select * from t7; +------+ | x | +------+ | 001 | | 011 | | 111 | | 1111 | #超过宽度限制仍然可以存 +------+ # int(宽度) 这里的宽度只是显示宽度,不是实际的存储宽度
注意:为该类型指定宽度时,仅仅只是指定查询结果的显示宽度,与存储范围无关,存储范围如下。其实我们完全没必要为整数