文章目录
1.MySQL数据类型
数据库中类型决定了储存这个数据所占用的大小,以及如何识别这个数据。
①数值类型
数据类型 | 说明 |
---|---|
bit(M) | 位类型,M指定位数,默认值1,范围1 ~ 64 |
tinyint [unsigned] | 有符号范围-128 ~ 127,无符号0 ~ 255,默认无符号(char) |
smallint [unsigned] | 有符号范围 -215 ~215 -1,无符号 216 -1(short) |
int [unsigned] | 有符号范围 -231 ~231 -1,无符号 232 -1(int) |
bigint [unsigned] | 有符号范围 -263 ~263 -1,无符号 264 -1(long long) |
bool | 0和1表示假和真 |
float(M,D)[unsigned] | M指定显示长度,D指定小数位数,占用四字节(float) |
double(M,D)[unsigned] | 表示精度比float大,占用八个字节(double) |
decimal(M,D)[unsigned] | 浮点数类型,M指定长度,D表示小数点的位数,精度比double更好一些 |
tinyint
当插入的数据大于数据类型的范围时会插入失败。
MySQL对数据的存储相比于C语言更加严格,MySQL数据类型本质就是一种约束。
bit(M)
如上图可知,当a的类型是比特时无法正常显示。这时因为此时a是按照二进制储存的。在解析时默认按照ascii表进行显示,10对应的ascii是不可见字符,所以打印无法正常显示。
小数类型测试
float(M,D)[unsigned]
float(M,D)[unsigned] M指定显示长度,D指定小数位数,占用四字节(float)、
eg:float(4,2)取值范围为:-99.99~99.99
如果输入99.498会被截断,遵循4舍5入原则,变为99.50。
99.994可以插入进去,99.995插入失败
如果float(4,2)设置成无符号,则取值范围为:0~99.99
decimal(M,D)[unsigned]
decimal(M,D)[unsigned] 浮点数类型,M指定长度,D表示小数点的位数,精度比double更好一些
eg:
decimal(5,2)范围是-999.99~999.99
如果设置无符号0~999.99
相比于float,decimal精确度更高一些。
对比float和decimal的精度
如上图可知,decimal和float储存相同的浮点数,对比decimal储存精确度更高。
decimal最大小数位是30位,宽度m最大65。float最大精度大约为7位。
②文本、二进制类型
数据类型 | 说明 |
---|---|
char(size) | 固定长度字符串类型,size最大255 |
varchar(len) | 可变长度字符串,len的大小与编码形式有关 |
blob | 二进制数据 |
text | 大文本,不支持全文索引,不支持默认值 |
char(size)
char(size) 固定长度字符串类型,size最大255
系统直接开辟size大小的空间存储字符串。如果你的长度小于size,剩余的空间就浪费了。
char(2)代表可以存两个字符,包括字母或者汉字。(这个字符需要与C语言区分开,这里一个汉字也是一个字符,数据库的一个字符大小不是一个字节)。
varchar(len)
varchar(len) 可变长度字符串。
在len个字符范围内,需要多少个字符空间,就开辟多少个,但是不能超过len个。
len的大小与编码方式有关:
- varchar最大可以存放65535字节的字符串,其中1~3个字节用来记录数据大小。所以有效大小为65532
- 如果是utf-8(一个字符占用三字节) len最大为65532÷3=21844
- 如果是gbk(一个字符占用两个字节)len最大为65532÷2=32766
char与varchar对比
这里统一采用utf-8的编码格式形式进行说明,varchar需要1到3个字节保存字符串长度(计数)。
③时间日期类型
数据类型 | 说明 |
---|---|
date/datetime/timestamp | 时间类型 |
date:日期格式年-月-日 占用三个字节
datetime:日期格式 年-月-日 时:分:秒 占用八字节。
timestamp:时间戳,格式与datetime相同,占用四字节。当更新数据时,时间戳会更新成当前时间。
在更新数据时timestamp类型时间也会更新
④enum与set类型
数据类型 | 说明 |
---|---|
enum | 字符串对象,其值来自表创建时在列规定的显示枚举的一个列值,只能从多个取值中选一个 |
set | 字符串对象,可以有多个值,这些值来自创建表时所规定,可以从多个值中选多个值 |
枚举:多选一。集合:多选多
下面通过喜欢的水果表来举例子:
eg:
总结:
- enum取值只能是设定好的字段,并且只能选一个。
- set的取值也只能是设定好的字段,但可以选择多个。
其次插入方式还有:
插入过程中可以采用数字的形式,1和2就像数组下标一样,自动对应枚举类型。1对应男(枚举第一个元素),2对应女。
set也可以采用数字的形式插入。
如上图发现,这里3不是对应set的第三个元素,而是前两个元素
而插入4号时对应的时set的第三个元素
当使用数字的方式插入set类元素时,此时数字不能类比数组下标,而是比特位.这一点与文件权限类似
set数据库查询方式:
find_ in_ set查找set类型数据
通常查找数据库的方式:
但是因为set的数据个数不止一个,所以查询时需要使用find_ in_ set函数
find_in_set(sub,str_list) :如果 sub 在 str_list 中,则返回下标;如果不在,返回0; str_list 用逗号分隔的字符串。
eg:
所以查所有喜欢吃的水果是苹果(不包含其他水果,严格匹配):
查找爱吃的水果中有苹果的人(不严格匹配):