文章目录
- 一,数值类型
- int类型
- bit类型
- 小数类型
- float 和 decimal
- 二,字符串类型
- char和varchar
- 日期和时间类型
- enum和set
一,数值类型
MySQL数据库里面的数据类型
int类型
int类型是一个大类
类型 | 大小 |
---|---|
tinyint | 1字节 (-27 ~ 27-1) |
smallint | 2字节 (-215 ~ 215-1) |
mediumint | 3字节 (-223 ~ 223-1) |
int | 4字节 (-231 ~ 231-1) |
bigint | 8字节 (-263 ~ 263-1) |
默认创建都是有符号的类型
为什么一个int就会有这么多类型?
- 类型多,可以应对各种不同的应用场景
- 节省资源,数据库里的内存资源十分宝贵
越界情况
- MySQL里面的数据内容若是越界,则会直接报错,不会像语言一样进行隐式转换、整型截断什么的
如图,直接报错,这是为了保证数据库里插入的数据一定是正确的。
bit类型
默认创建bit类型的大小为1比特位
注意事项:
- bit类型里面的数据以ASCII码对应的字符存储
- bit类型可指定的最大长度为64位,过大或者越界都是直接报错
小数类型
float 和 decimal
# {}表示里面内容是可选项,不填则有默认
float{(m,d)} {unsigned} # m表示总长度(包括小数位数),d表示小数位数,unsigned表示无符号类型
decimal{(m,d)} {unsigned} # m表示总长度(包括小数位数),d表示小数位数,unsigned表示无符号类型
注意事项:
- 范围:有长度看长度位数。如:float(4,2) 的范围是 -99.99 ~ 99.99;float(4,2) unsigned 的范围是0~99.99
- 精度:四舍五入。如:以float(4,2)为例,插入的数据为 98.995,则会成为99.00;若98.994,则会成为98.99;但插入的数据为99.999,则会报错,因为超出范围
decimal和float用法类似,不多赘述。
区别:
- float 占4个字节,decimal 占8个字节
- decimal 比 float精度更高
- float 浮点数一定存在精度是损失
二,字符串类型
char和varchar
char(n) 定长字符串类型,n表示单位字符数量,最大值为255
- 定长:mysql会给char类型直接分配固定大小的内存。char(2),就表示会开辟2个单位字符的大小来存储字符。
- 单位字符:比如:“ab”,“中国”,这类的单位字符就为2,但实际存储大小会由于编码格式不同而不同,以UTF-8编码,"ab"占2个字节,"中国"占6个字节。
varchar(n) 变长字符串类型,n表示字符长度,最大值为65535字节
- 这里的 n 表示字符长度,因为是变长,所以是动态申请内存来存储数据。值得注意的是,varchar存储数据时,会分配1~3个字节来记录数据的大小,所以实际可用的最大空间应该是65532字节
使用场景:
- 如果数据确定长度都一样,就使用定长(char),比如:身份证,手机号,md5
- 如果数据长度有变化,就使用变长(varchar), 比如:名字,地址,但是你要保证最长的能存的进去。
- 定长的磁盘空间比较浪费,但是效率高。
- 变长的磁盘空间比较节省,但是效率低。
- 定长的意义是,直接开辟好对应的空间
- 变长的意义是,在不超过自定义范围的情况下,用多少,开辟多少
日期和时间类型
名称 | 大小 | 格式 | 特点 |
---|---|---|---|
date | 3字节 | ‘yyyy-mm-dd’ | 固定时间,需要手动更改 |
datetime | 8字节 | ‘yyyy-mmm-dd hh:mm:ss’ | 固定时间,需要手动更改 |
timestamp | 4字节 | ‘yyyy-mmm-dd hh:mm:ss’ | 时间戳,每次插入或更新数据,时间也会自动更新 |
enum和set
enum 枚举
# 语法 enum('选项1','选项2','选项3',...)
以上插入数据时,选项单选一个
set 集合
# 语法 set('选项1','选项2','选项3',...)
以上插入数据时,选项最多可以选满,是多选选项
- enum的数字下标
插入或者查询数据时,可以填写内容,也可以填写数字,如上例子:1表示‘男’,2表示‘女’。(数字从1开始) - set的数字位图
同上,但是不同的是,这个数字是按位图操作(即二进制1的位置),如:1表示语文,2表示数学,3表示语文和数学,以此类推。
建议:不用用数字,因为不便于阅读
函数 find_in_set
查找一个元素,成功返回下标# 语法 find_in_set(sub, str_list)