个人主页:Lei宝啊
愿所有美好如期而遇
目录
1.数据类型分类
2.数值类型
(1).tinyint,smallint类型等
(2)bit类型
(3)小数类型
1).float
2).decimal
3.字符串类型
(1)char
(2)varchar
(3)char和varchar比较
(4)日期和时间类型
(5)enum和set
综合举个栗子
1.数据类型分类
数值类型:bit
tinyint smalliint int bigint
float double decimal
bool
文本,二进制类型:
char
varchar
text
时间日期:date datetime timestamp
String类型:
enum
set
2.数值类型
(1).tinyint,smallint类型等
事实证明,mysql不允许不合法的数据插入,-129和128超出了tinyint的范围。
接下来我们测试一下无符号tinyint的范围。
显然,变成了0~255.
(2)bit类型
bit[(M)] : 位字段类型。M表示每个值的位数,范围从1到64。如果M被忽略,默认为1
我们发现竟然什么都没有,为什么呢?
bit字段在显示时,是按照ASCII码对应的值显示
先将num的范围改大点
(3)小数类型
1).float
float[(m, d)] [unsigned] : M指定显示长度,d指定小数位数,占用空间4个字节
小数:float(4,2)表示的范围是-99.99 ~ 99.99,MySQL在保存值时会进行四舍五入
我们先不指定宽度和小数位数。
可以看出默认6位小数,再多就会丢失精度。
接下来指定一下宽度和精度。
99.9954进位后就是100.00,超出宽度,数据不合法,数据库不允许插入,精度一定会保持两位,哪怕是补两个0.
这样也可以。
接下来看一下无符号float
于是我们知道了,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。
decimal的精度很高,基本上插入几就是几,float丢失精度就比较多了。
3.字符串类型
(1)char
char(L): 固定长度字符串,L是可以存储的长度,单位为字符,最大长度值可以为255
注意:utf8中一个字符占3个字节,而gbk中一个字符占2个字节
这里的一个字符可以是数字,字母,符号和汉字,都是一个字符。
(2)varchar
varchar(L): 可变长度字符串,L表示字符长度,最大长度65535个字节
关于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)char和varchar比较
如何选择定长或变长字符串?
如果数据确定长度都一样,就使用定长(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 完全一 致, 占用四字节
先插入一个date类型的数据。
emmm?我们没插入datastamp类型的数据啊,为什么呢?这是因为他有default值,也就是默认值,当我们不插入时,默认插入现在的时间。而且就算你刻意插入NULL,插不进去,因为他不允许为空。
而且时间戳会自动更新当前时间。
(5)enum和set
enum:枚举,“单选”类型;
enum('选项1','选项2','选项3',...);
不可插入多个选项。
set:集合,“多选”类型;
set('选项值1','选项值2','选项值3', ...);
再插入几个数据。
将set里的选项当做比特位,a就是1,a,b就是11,a,b,c就是111,转换为十进制就是1,3,7
再来看一个。
这样也是可以的。
但是我们也想找包含‘a’的所有项,怎么找?
集合查询使用find_ in_ set函数:
find_in_set(sub,str_list) :如果 sub 在 str_list 中,则返回下标;如果不在,返回0
首先select可以执行表达式和函数。
非0为true,而且我们看到这个函数只能查找单个字符。
这样我们就筛选出了所有爱好为a的人。
那么如何筛选爱好为a,b的人呢?
用and连接就好了。
综合举个栗子
先建个新表。
不可以这样查找。
这样查可以,但是不能够包含。