一、数值型
5 种整型 tinyint、smallint、mediumint、int 和 bigint,主要区别就是取值范围不同,还可以在类型前添加一个 限制词 unsigned,不允许添加负数。
3 种浮点型:不能精确存放 float 和 double,可以精确存放 decimal 和 numeric
整型数
mysql 提供了 5 种整型:tinyint、smallint、mediumint、int 和 bigint, 最大的区别就是取值范围tinyint 1B、smallint 2B、mediumint 3B、int 4B、bigint 8B
整数类型适用场景
1、tinyint 一般用于枚举类型,比如系统设定取值范围很小而且固定的场景 。
2、smallint 可以用于较小范围的统计数据,比如统计工厂的固定资产库存数量等 。
3、MediumInt 用于较大整数的计算,比如火车站每日的客流量等 。
4、Int 或者 Integer【别名系统】取值范围足够大,一般情况下不用考虑超限问题,用得最多,例如商品编号 。
5、BigInt 只有处理特别巨大的整数时才会用到,例如双 11 的交易量、大型门户网站点击量、证券公司衍生产品持仓量等。
浮点数
decimal 和 numeric 作为字符串存储浮点数,可以实现浮点数的精确存储,并不是 float 和 double 种使用二进制浮点数存储。使用方法 numeric(总位宽,小数位数),小数位数必须小于等于总位宽;小数位数最大值 30,总位宽最大值为 65,注意可能存储的数据会超出范围,其中的符号位和小数点不占位宽。
二、字符串类型
char(n)
定长字符串,n 值用于表示所允许的最大长度,取值范围 0-255,如果不指定长度,默认1
1、长度限制不区分中英文,表示是允许最多存储多少个字符
2、使用 length 函数获取的是字节数,不是字符数。在 utf-8 编码种一个汉字占用 3 个字节。当指定 char 的 n 值大于 0,而插入数据小于 n 值,系统会自动在末尾使用空格补够长度,由于系统无法区分是自动添加的空格还是字符串末尾的空格,所以进行等值判断时,去除末尾空格进行比对。
varchar(n)
可变长度的字符串,n 值取值范围为 0-65535,如果不设置 n 值则报错。实际存储多少个字符就占多少个位置,每个列所占用的长度根据具体内容变化。
注意:单一的 where id='a'仍旧不能区分存储的内容是 a 还是 a 【a 空格】,但是 length 函数可以区分字符串的长度。例如 select * from t5 where id='a' and length(id)>1;
char 和 varchar 的区别
1、char 属于定长,varchar 属于变长。选择最基本的依据就是定长使用 char,变长使用 varchar
2、char 允许的最大长度为 255,varchar 允许的最大长度为 65535
3、如果存储的字符串长度变化不大,推荐优先考虑使用 char,例如针对口令进行 md5 加密,固定长度的行不容易产生碎片;对于长度很短的列,char 的性能优于 varchar,是因为 varchar 需要引入额外一个或者两个字节存储字符串长度。
4、char 在计算种会自动去除空格;varchar 不会去除空格,但是进行字符串比较时,会去除空格后进行比较;在插入数据时系统会自动去除字符串默认多余的空格。
三、大对象类型 Lob
大对象类型可以分为 2 大类:文本类型和二进制类型。
1、BLOB 是一个二进制大对象,可以容纳可变长度的数据,其中分为 tinyblob、blob、mediumblob、longblob。 一般用于存储二进制数据,例如声音、图像、视频等。
2、Text 是一个文本大对象,可以容纳可变长度的字符串数据,实际上还有一种写法为 clob,其中分为 tinytext、text、mediumtext、longtext,一般用于存储文本类型数据,例如小说、商品简介。
两者之间的区别:
1、BLOB 是二进制类型,可以容纳可变长度的数据,区分大小写;TEXT是一个不区分大小写的 BLOB。
2、TEXT 文本类型,可以存比较大的文本段,搜索速度稍慢,因此如果不是特别大的内容,建议使用 CHAR,VARCHAR 来代替。还有 TEXT 类型不用加默认值,加了也没用。而且TEXT 和 BLOB 类型的数据删除后容易导致空洞,使得文件碎片比较多,所以频繁使用的表不建议包含 TEXT 类型字段,建议单独分出去,单独用一个表。
四、日期时间类型
MySQL 有多种表示日期和时间的数据类型,不同的版本可能有所差异,MySQL8 版本支持的日期和时间类型主要有 year 类型、time 类型、date 类型、datetime 类型和 timestamp 类型
1、year 通常用来表示年份
2、date 通常用来表示年月日
3、time 通常用来表示时分秒
4、datetime 通常用来表示年月日时分秒
5 、 timestamp 通常用来表示带时区的年月日时分秒
五、集合和枚举类型
set 集合类型,可以设置多个集合成员,允许从多个集合成员种选择多个数据进行插入。
enum 枚举类型,可以设置允许选用的多个值,列只能赋予某个枚举成员值。
六、位类型
bit 类型存储的是二进制值。
bit(M)类型,M 为表示二进制的位数,取值范围 1<=M<=64,占用空间大约为(m+7)/8 个字节。如果没有指定 M,默认是 1 位,这个 1 位表示只能存储 1 位的二进制值,这里 M 是表示二进制位数。
总结
1、定义数据类型就是定义列,数据类型决定数据的特性【域完整性】
2、数据类型主要分为字符串类型、定点数和浮点数类型、日期类型、大对象类型【慎用】
3、数据类型在不同的存储引擎上【innodb MyISAM Memory】表现不同。
4、数据所采用的数据类型是根据业务需求和对应的数据类型特征进行选择,不建议使用过于复杂的数据类型。