一、数据类型初识
决定了存储数据时应该开辟的空间大小
决定了如何识别一个特定的二进制序列
决定了数据的取值范围
注意:MySQL本身是不支持bool类型的,当把一个数据设置成bool类型时,数据库会自动将其转换成tinyint(1)的数据类型,其实这个就是变相的bool类型,因为tinyint(1)只有1和0两种取值,可以分别对应bool类型的true和false
二、数值类型
2.1 tinyint类型
有符号tinyint范围测试
创建一个表,表当中包含一个tinyint类型的列,默认其为有符号类型
由于tinyint类型占用1字节,因此有符号tinyint的取值范围为-128~127,插入该范围内的数据时都能成功插入
若插入的数据不在-128~127范围内,那么就会发生报错
无符号tinyint范围测试
创建一个表,表当中包含一个tinyint类型的列,并指定其为无符号类型
由于tinyint类型占用1字节,因此无符号tinyint的取值范围为0~255,插入该范围的数据时都能成功插入
若插入的数据不在0~255范围内,那么就会发生报错
除非场景要求数值类型必须是无符号,否则尽量不要使用无符号,因为有符号的数值类型存不下的数据,其对应的无符号类型同样可能存不下,这时应直接将数值类型提升
2.2 bit类型
bit类型的显示方式
创建一个表,表中包含一个int类型的id列和一个8位bit类型的data列
表中插入一条记录,记录中指定id和data的值均为10,插入记录后查看表会发现data的值显示的并不是10
根本原因是因为bit类型在显示时,是按照ASCII码对应的值进行显示的,而在ASCII码表中10对应的是控制字符LF,表示换行的意思。若向表中插入记录时指定id和data的值均为65,由于ASCII码表中65对应的是字符A,因此插入记录后查看表就会发现data的值显示的是A
bit类型的范围测试
创建一个表,表中包含用户名name和用户性别gender,其中gender的类型可以指定为1位bit类型,因为性别只有男和女两种取值,使用1个bit位来表示用户性别可以节省空间
若规定gender列插入0表示男,插入1表示女,那么在插入用户信息时就可通过插入0和1来指定用户的性别
若插入gender列的数据不是0或1,那么插入数据时就会发生报错
虽然MySQL提供了位类型bit,但不建议将数据类型设置成位类型,除非将来这个数据本身就只给程序看,并且数据本身非常占用资源
因为查询位类型数据时,默认会按照ASCII码对应的值进行显示,这对于数据库管理员维护数据库或程序员调试程序都不太方便
2.3 float类型
有符号float范围测试
创建一个表,表中包含一个float(4,2)类型的列,默认其为有符号类型
由于float(4,2)的取值范围为-99.99~99.99,因此插入该范围内的数据都能成功插入
由于MySQL在保存值时会进行四舍五入,因此实际可插入float(4,2)的范围为-99.994~99.994,若插入的数据不在该范围内,那么插入数据时就会报错
无符号float范围测试
创建一个表,表中包含一个float(4,2)类型的列,并指定其为无符号类型
无符号float类型的取值范围,实际就是把对应有符号float类型中的负数部分拿走了,因此float(4,2)的取值范围为0~99.99,实际可插入的范围是0~99.994
2.4 decimal类型
decimal的精度更高
decimal和float类型的使用方式相同,但decimal的精度比float更高。创建一个表,表中分别包含一个float(10,8)的列和一个decimal(10,8)的列
向表中插入一条记录,指定float和decimal的值均为23.12345612,但最终查表时会发现decimal保持了数据的原貌,而float则会存在一定的精度损失