MySQL-数据类型

MySQL-数据类型

  • 数值类型
    • bit
    • tinyint
    • float
    • decimal
  • 字符串和文本类型
    • char
    • varchar
    • blob
    • text
  • 日期和时间类型
  • enum-枚举类型
  • set-集合类型

数值类型

数据类型 说明
bit(M) 位类型。M指定位数,默认值为1,范围1-64.
tinyint [unsigned] 带符号范围:-128 - 127,无符号范围: 0 - 255
bool 使用0和1表示假和真
smallint [unsigned] 带符号范围:-2^15 - 2^15 - 1,无符号范围:0 - 2^16 - 1
mediumint [unsigned] 带符号范围:-2^23 - 2^23 - 1,无符号范围:0 - 2^24 - 1
int [unsigned] 带符号范围:-2^31 - 2^31 -1,无符号范围:0 - 2^32 - 1
double [unsigned] 带符号范围: -2^63 - 2^63 - 1,无符号范围: 0 - 2^64 - 1
float[(M,D)] [unsigned] M表示显示长度,D表示小数点的位数,占用4字节
double[(M,D)] [unsigned] 精度比float更高的浮点数,占用8字节
decimal[(M,D)] [unsigned] M指定长度,D表示显示小数的位数

bit

bit[M]:M表示使用的比特位数,范围为1-64,bit位在显示的时候是按照Ascll码来显示的。
MySQL-数据类型_第1张图片

insert into t1 values(10);
insert into t1 values(11);
insert into t1 values(12);

MySQL-数据类型_第2张图片
可以看到插入的三个数据是显示不出来的,那是因为Ascll值为10 11 12的字符为不可显字符。插入48那么显示出来就为‘0’;
MySQL-数据类型_第3张图片

tinyint

tinyint占用1个字节,对于有符号而言取值范围是-128 - 127。无符号的范围是0 - 255。当用户在插入数据超出其所表示的范围后会拦截我们插入。
MySQL-数据类型_第4张图片

insert into t2 values(127,255);
insert into t2 values(-128,255);

MySQL-数据类型_第5张图片

mysql会对非法数据进行拦截

insert into t2 values(128,0);

在这里插入图片描述

float

float[(M,D)], M:显示长度,D:指定小数位数。

  • 例如float(4,2)所能表示的范围就是(-99.99 - 99.99),如果用unsigned修饰那么范围就是(0 - 99.99)在插入数据时会四舍五入.
insert into t3 values(-99.99);
insert into t3 values(99.99);
insert into t3 values(99.994);
insert into t3 values(-99.994);

MySQL-数据类型_第6张图片
同样当超出其能表示的范围后也会对我们的插入做拦截。
在这里插入图片描述

decimal

decimal的用法与float一样,与float的区别是decimal比float更加精确。

insert into t4 values(14.1234567,14.1234567);

MySQL-数据类型_第7张图片
float的精度大约是7位,对于decimal而言,支持的最大整数位数65位,支持的最大小数位数30位。decimal(M,D)默认情况下M的值为10,D的值为0。
float和double是采用标准的浮点数存储形式,decimal实际存储的是字符串。

字符串和文本类型

数据类型 说明
char(size) 固定长度字符串,size的最大值为255
varchar(size) 可变长度字符串,最大长度为65535字节
blob 二进制数据
text 大文本,不支持全文索引,不支持默认值

char

char(size):size的最大值为255,表示char字符串最多存储255个字符(注意是字符不是字节)

MySQL-数据类型_第8张图片
char(2)表示能够存储两个字符。

insert into t5 values('ab');
insert into t5 values('张三');//utf8编码规则下一个中文字符占用3个字节

MySQL-数据类型_第9张图片

varchar

varchar(size)是变长字符串,当实际字符串长度小于size时,那么占用的空间以实际varchar长度为准。注意:这里的size指的是字节

  • varchar的长度为0-65535之间的值,但是其中要占用1-3字节来记录实际varchar的长度,所以varchar的实际可用长度最大为65532字节。
  • 那么,在不同的编码规则下,varchar所能存储的字符数量也是不同的,例如在utf8编码规则下一个字符占用3字节,所以varchar可存储的最大字符数为 65532 / 3。在gbk编码规则下一个字符占用2字节,所以varchar可存储的最大字符数为65532 / 2。

varchar和char该如何选择呢?

1.当存储一些定长的数据的时候,例如身份证号,手机号,学号等等,最好使用定长字符串。
2.当存储的数据长度不定的时候,例如名字,家庭住址,商品名称等等,最好使用变长字符串。
3.定长字符串IO效率高。
4.变长字符串IO效率低。

blob

例如,在持久化存储的时候,通常都要对结构化数据进行序列化,将序列化后的数据进行持久化存储,序列化的工具有很多,Json,protobuf等等,使用protobuf序列化的结果就是二进制数据,此时就可以使用blob数据类型来存储。

text

当存储一些大的文本数据时,就可以使用text数据类型,text数据类型不支持全文索引,不支持默认值。

日期和时间类型

常用的时间类型有以下三种:

  • date:‘yyyy-mm-dd’,表示年月日,占用3字节。
  • datatime:‘yyyy-mm-dd HH:ii:ss’,表示年月日时分秒,表示范围1000-9999,占用8字节。
  • timestamp:时间戳,从1970年至今的秒数,表示的格式与datatime一致,占用4字节。

注意: 时间戳形式的数据在插入时不用显示的插入数据,系统会自动填入此时的时间戳,并且在进行更新数据时,时间戳数据也会自动更新。

MySQL-数据类型_第10张图片

insert into t7(birthday,time) values('2000-01-01','2000-01-01 15:15:15');

MySQL-数据类型_第11张图片

update t7 set time='2020-10-01 09:00:00';

MySQL-数据类型_第12张图片
可以看到更新数据时,时间戳字段也会自动更新。

enum-枚举类型

enum类型,多选一,在实际存储的时候只会存储众多选项中的 某一个值。而处于效率考虑,这些值实际存储时存储的是‘数字’,枚举常量中的每个值对应 1…,最大到65535个,所用插入枚举值的时候,不仅可以使用枚举值也可以使用其对应的数字。

例如,在表示性别的时候,就可以使用enum类型。

create table t8 ( sex enum('男','女') );

MySQL-数据类型_第13张图片

insert into t8 values('男');
insert into t8 values(1);

MySQL-数据类型_第14张图片
可以看到,无论插入’男’还是1,结果都是一样的。

set-集合类型

set类型,支持多选一,多选多,当然也可以不选填入NULL值。同样,实际集合类型存储的也是‘数字’,集合中的每个选项对应1,2,4,8…,最多64个。可以理解为每个二进制位对应一个选项。在插入时同样可以使用数字。(无论枚举还是集合,不建议使用数字的形式,不易阅读)。

例如,描述一个人爱好的时候,就可以使用集合类型,比如一个人的爱好有抽烟,喝酒,烫头。

create table t10 ( id int, hobby set('跑步','游泳','篮球','足球','排球','骑行'));

MySQL-数据类型_第15张图片

insert into t10 values(1,'篮球,跑步,游泳'),(2,'篮球,排球,足球'),(3,'骑行,跑步,足球,游泳'),(4,'游泳');

MySQL-数据类型_第16张图片
查询时可以使用名称和数字都可以。
MySQL-数据类型_第17张图片
MySQL-数据类型_第18张图片

7 = 1 + 2 + 4 :表示爱好为跑步,游泳,篮球的人。

面临的问题:例如,我们想查询出爱好有篮球的人,使用hobby=‘篮球’是不对的(这个意思是爱好只有篮球的人),可以借助find_in_set(sub,list)函数来完成。如果sub在list中返回其下标(从1开始),不在就返回0。

MySQL-数据类型_第19张图片

select * from t10 where find_in_set('篮球',hobby);

MySQL-数据类型_第20张图片

选出爱好有骑行或者有游泳的人。

select * from t10 where find_in_set('骑行',hobby) or find_in_set('游泳',hobby);

MySQL-数据类型_第21张图片

你可能感兴趣的:(MySQL,mysql,android,数据库,linux)