3.MySQL数据类型详解

个人主页:Lei宝啊 

愿所有美好如期而遇


1.数据类型分类

数值类型:bit 

                  tinyint  smalliint  int  bigint  

                  float  double  decimal 

                  bool

文本,二进制类型:

                  char

                  varchar

                  text

时间日期:date  datetime  timestamp

String类型:

                  enum

                  set

2.数值类型

3.MySQL数据类型详解_第1张图片

(1).tinyint,smallint类型等

3.MySQL数据类型详解_第2张图片

事实证明,mysql不允许不合法的数据插入,-129和128超出了tinyint的范围。

3.MySQL数据类型详解_第3张图片

接下来我们测试一下无符号tinyint的范围。

3.MySQL数据类型详解_第4张图片

3.MySQL数据类型详解_第5张图片

 显然,变成了0~255.

(2)bit类型

bit[(M)] : 位字段类型。M表示每个值的位数,范围从1到64。如果M被忽略,默认为1

3.MySQL数据类型详解_第6张图片

3.MySQL数据类型详解_第7张图片

我们发现竟然什么都没有,为什么呢?

bit字段在显示时,是按照ASCII码对应的值显示

先将num的范围改大点

3.MySQL数据类型详解_第8张图片

3.MySQL数据类型详解_第9张图片

(3)小数类型

1).float

float[(m, d)] [unsigned] : M指定显示长度,d指定小数位数,占用空间4个字节

小数:float(4,2)表示的范围是-99.99 ~ 99.99,MySQL在保存值时会进行四舍五入 

3.MySQL数据类型详解_第10张图片

我们先不指定宽度和小数位数。

3.MySQL数据类型详解_第11张图片

可以看出默认6位小数,再多就会丢失精度。

3.MySQL数据类型详解_第12张图片

3.MySQL数据类型详解_第13张图片

接下来指定一下宽度和精度。

3.MySQL数据类型详解_第14张图片

99.9954进位后就是100.00,超出宽度,数据不合法,数据库不允许插入,精度一定会保持两位,哪怕是补两个0.

3.MySQL数据类型详解_第15张图片

这样也可以。 

3.MySQL数据类型详解_第16张图片

接下来看一下无符号float

3.MySQL数据类型详解_第17张图片

3.MySQL数据类型详解_第18张图片

于是我们知道了,float(4,2) unsigned 类型的数据范围只有0~99.99

2).decimal

decimal(m, d) [unsigned] : 定点数m指定长度,d表示小数点的位数

decimal整数最大位数m为65。支持小数最大位数d是30。如果d被省略,默认为0.如果m被省略,
默认是10。
建议:如果希望小数的精度高,推荐使用decimal。

3.MySQL数据类型详解_第19张图片

3.MySQL数据类型详解_第20张图片

3.MySQL数据类型详解_第21张图片

decimal的精度很高,基本上插入几就是几,float丢失精度就比较多了。

3.MySQL数据类型详解_第22张图片

3.字符串类型

(1)char

char(L): 固定长度字符串,L是可以存储的长度,单位为字符,最大长度值可以为255

注意:utf8中一个字符占3个字节,而gbk中一个字符占2个字节 

这里的一个字符可以是数字,字母,符号和汉字,都是一个字符。

3.MySQL数据类型详解_第23张图片

3.MySQL数据类型详解_第24张图片

3.MySQL数据类型详解_第25张图片

(2)varchar

varchar(L): 可变长度字符串,L表示字符长度,最大长度65535个字节

3.MySQL数据类型详解_第26张图片

 3.MySQL数据类型详解_第27张图片

关于varchar(len),len到底是多大,这个len值,和表的编码密切相关: 

varchar长度可以指定为0到65535之间的值,但是有1 - 3 个字节用于记录数据大小,所以说有效字
节数是65532。
当我们的表的编码是utf8时,varchar(n)的参数n最大值是65532/3=21844[因为utf中,一个字符占
用3个字节],如果编码是gbk,varchar(n)的参数n最大是65532/2=32766(因为gbk中,一个字符
占用2字节)。

3.MySQL数据类型详解_第28张图片

(3)char和varchar比较

3.MySQL数据类型详解_第29张图片

如何选择定长或变长字符串?

如果数据确定长度都一样,就使用定长(char),比如:身份证,手机号,md5
如果数据长度有变化,就使用变长(varchar), 比如:名字,地址,但是你要保证最长的能存的进去。
定长的磁盘空间比较浪费,但是效率高。
变长的磁盘空间比较节省,但是效率低。
定长的意义是,直接开辟好对应的空间
变长的意义是,在不超过自定义范围的情况下,用多少,开辟多少。

(4)日期和时间类型

date            :日期 'yyyy-mm-dd' ,占用三字节
datetime    :时间日期格式 'yyyy-mm-dd HH:ii:ss' 表示范围从 1000 到 9999 ,占用八字节
timestamp :时间戳,从1970年开始的 yyyy-mm-dd HH:ii:ss 格式和 datetime 完全一                              致, 占用四字节

3.MySQL数据类型详解_第30张图片

先插入一个date类型的数据。

3.MySQL数据类型详解_第31张图片

emmm?我们没插入timestamp类型的数据啊,为什么呢?这是因为他有default值,也就是默认值,当我们不插入时,默认插入现在的时间。而且就算你刻意插入NULL,插不进去,因为他不允许为空。

 3.MySQL数据类型详解_第32张图片

而且时间戳会自动更新当前时间。

3.MySQL数据类型详解_第33张图片

(5)enum和set

enum:枚举,“单选”类型;
enum('选项1','选项2','选项3',...);

3.MySQL数据类型详解_第34张图片

3.MySQL数据类型详解_第35张图片

不可插入多个选项。

set:集合,“多选”类型;
set('选项值1','选项值2','选项值3', ...); 

3.MySQL数据类型详解_第36张图片3.MySQL数据类型详解_第37张图片

再插入几个数据。

3.MySQL数据类型详解_第38张图片

3.MySQL数据类型详解_第39张图片

将set里的选项当做比特位,a就是1,a,b就是11,a,b,c就是111,转换为十进制就是1,3,7

3.MySQL数据类型详解_第40张图片

3.MySQL数据类型详解_第41张图片

再来看一个。

3.MySQL数据类型详解_第42张图片

这样也是可以的。

但是我们也想找包含‘a’的所有项,怎么找?

集合查询使用find_ in_ set函数:
find_in_set(sub,str_list) :如果 sub 在 str_list 中,则返回下标;如果不在,返回0

首先select可以执行表达式和函数。

3.MySQL数据类型详解_第43张图片3.MySQL数据类型详解_第44张图片

非0为true,而且我们看到这个函数只能查找单个字符。

3.MySQL数据类型详解_第45张图片

这样我们就筛选出了所有爱好为a的人。

3.MySQL数据类型详解_第46张图片

那么如何筛选爱好为a,b的人呢?

3.MySQL数据类型详解_第47张图片

用and连接就好了。

综合举个栗子

先建个新表。

3.MySQL数据类型详解_第48张图片

3.MySQL数据类型详解_第49张图片

3.MySQL数据类型详解_第50张图片

3.MySQL数据类型详解_第51张图片

不可以这样查找。

这样查可以,但是不能够包含。

3.MySQL数据类型详解_第52张图片

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