【MySQL】数据类型
- 一、常见数据类型
- 二、数值类型
- 2.1 整型
- 2.1.1 小结
- 2.2 bit类型
- 2.3 float 类型
- 2.4 decimal类型---精度更高
- 三、字符串类型
- 3.1 char---固定字符串
- 3.2 varchar---变长字符串
- 3.2.1 char和varchar区别
- 3.3 日期和时间类型
- 3.4 enum和set
- 3.4.1 set查询----find_in_set
一、常见数据类型
二、数值类型
2.1 整型
- 创建表t1,将name列数据类型设置为要tinyint
- 插入属性值:由于这里是tinyint类型,取值范围是【-128–127】,当插入这个范围内的数据显示成功,范围之外失败
- 使用tinyint unsigned类型创建表t2
无符号类型取值范围【0,255】,这点与C/C++一样
2.1.1 小结
- MySQL对于数据类型不合法行为采取直接报错,阻止我们继续操作
- 这也说明了我们插入表里面的数据一定是合法的
- 在MySQL中,数据类型本身也是一种约束:逼着程序员合法使用,保证数据库中的数据是可预期,完整的
- 创建表的时候,使用无符号类型需要在后面定义,这点与C/C++不同
其余整型使用方法和约束与tinyint一样
2.2 bit类型
bit[(M)] : 位字段类型。M表示每个值的位数,范围从1到64。如果M被忽略,默认为1。
-
创建表t3
-
插入数据
可以发现插入2的时候报错,这是因为2无法用1个bit位表示;
查表发现,gender没有显示任何属性,这是因为bit类型的数据默认以ASCLL码显示,但是ASCLL码0、1不可见,可以通过select id,hex(gender) from t3;
进行十进制查看
-
修改列的属性
-
修改列的属性
将gender列bit位改为10位,插入
对比之下可以发现:bit字段在显示时,是按照ASCII码对应的值显示
2.3 float 类型
float[(m, d)] [unsigned] : M指定显示长度,d指定小数位数,占用空间4个字节
小数:float(4,2)表示的范围是-99.99 ~ 99.99,MySQL在保存值时会进行四舍五入。
这里我创建了一个表t4:要求其salary字段是float类型,并且显示长度为4,小数位数为2
无符号测试
这里我在表t4的基础上增加一个字段aneno,并将其设置为无符号float类型
通过上图可以发现。无符号类型的float,负数是无法插入的
2.4 decimal类型—精度更高
decimal(m, d) [unsigned] : 定点数m指定长度,d表示小数点的位数
decimal使用方法和限制条件与float一样,唯一不同的就是精度方面
float表示的精度大约是7位
decimal整数最大位数m为65。支持小数最大位数d是30。如果d被省略,默认为0.如果m被省略,
默认是10。(不同平台精度或许不用,仅供参考)
三、字符串类型
3.1 char—固定字符串
char(L): 固定长度字符串,L是可以存储的长度,单位为字符,最大长度值可以为255
创建一个表t5将其name字段设置为两个字符,插入英文字符与中文字符实验结果如下
结论:
- char数据类型本身与前面几种一样带有约束(越界报错)
- 与C/C++语言中一个字符占一个字节不一样,在GBK中一个汉字占两个字节,UTF-8中一个汉字占三个字节,但是 在mysql中,一个汉字就是一个字符
- 由于char固定长度最大为255,建表的时候超过这个数会直接报错
3.2 varchar—变长字符串
varchar(L): 可变长度字符串,L表示字符长度,最大长度65535个字节,在不同编码中,L的最大长度不同,utf-8中最大是是21845
创建表t7,name字段设置为4个字符,使用方法和char一样
- varchar长度可以指定为0到65535之间的值,但是有1 - 3 个字节用于记录数据大小,所以说有效字
节数是65532。 - 当我们的表的编码是utf8时,varchar(n)的参数n最大值是65532/3=21844[因为utf中,一个字符占
用3个字节],如果编码是gbk,varchar(n)的参数n最大是65532/2=32766(因为gbk中,一个字符
占用2字节) - 表的一行也有长度限制如果一行中有其他字段,那么varchar就不能设置为最大值
3.2.1 char和varchar区别
根据需求,合理选择char/varchar
如果数据确定长度都一样,就使用定长(char),比如:身份证,手机号,md5(密码摘要)
如果数据长度有变化,就使用变长(varchar), 比如:名字,地址,但是你要保证最长的能存的进去。
定长的磁盘空间比较浪费,但是效率高。
变长的磁盘空间比较节省,但是效率低。
定长的意义是,直接开辟好对应的空间
变长的意义是,在不超过自定义范围的情况下,用多少,开辟多少。
3.3 日期和时间类型
常用的日期有如下三个:
- date :日期 ‘yyyy-mm-dd’ ,占用三字节
- datetime 时间日期格式 ‘yyyy-mm-dd HH:ii:ss’ 表示范围从 1000 到 9999 ,占用八字节
- timestamp :时间戳,从1970年开始的 yyyy-mm-dd HH:ii:ss 格式和 datetime 完全一致,占用四字节
创建表t8,带有三个字段,分别是日期、日期时间、时间戳;前两个字段需要传入,时间戳不需要
更新数据或新插入数据,时间戳也会被改变,如下图
日期时间类型适用于不需要改变时间的场景:上下班打卡
时间戳类型适应于频繁改变时间场景:发帖子
3.4 enum和set
enum:枚举,“单选”类型;enum(‘选项1’,‘选项2’,‘选项3’,…);
set:集合,“多选”类型;set(‘选项值1’,‘选项值2’,‘选项值3’, …);
有一个调查表,需要调查人的喜好, 比如(唱,跳,rap,篮球)中去选择(可以多选),(男,女)[单选]
enum插入可以选择直接用枚举常量,也可以选择常量下标,但是注意,枚举常量下标默认从1开始;对于非枚举常量,mysql直接报错
set插入特点:可以直接用选项值,也可以用数字,但是插入的数据必须是集合里面的
使用数字进行插入,结合linux权限理解
这个数字使用位图来表示的,比如以上爱好中全选对应的位图结构就是1111(15)
3.4.1 set查询----find_in_set
find_in_set(sub,str_list) :如果 sub 在 str_list 中,则返回下标;如果不在,返回0;
str_list 用逗号分隔的字符串。
绝对查询:结果是只含有特定字段的信息,如:select * from t9 where hobby='唱';
查询包含有特定字段的的信息