数据类型分类
数值类型
tinyint类型
创建一个表,表中变量num的数据类型为tinyint
数据越界测试:
在数据类型范围内都可以插入,越界插入会报错
创建一个表,表内数据类型弄成无符号的:
无符号的tinyint的范围为0~255,如果插入-1或256会直接拦截。
我们向MYSQL数据类型中插入不合法的数据,MYSQL一般都直接会拦截,不让我们操作,而我们插入到表中的,一定是合法的数据。在c语言中如果是int转char就会发生截断,MYSQL这里不存在截断,对于MYSQL,数据类型也是一种约束.
bit类型
bit类型,位类型.
bit[M]:位字段类型。M表示位数,范围从1到64,如果M被忽略,默认为1.
online表示是否在线,0为不在线,1为在线,插入数据:
online插入0,1是成功的.
继续插入:
online插入2,3,4都失败了,因为bit定义时只有一位,一个bit位只能表示0,1,我们可以用其他进制显示online
修改bit位数:
从一位改为十位
最大表示的数就到2^10-1;即1023;
online插入字符‘a’
字符a的ascll码为97,对应十六进制为61
bit只能表示正整数,如果插入负数会直接拦截:
测试bit位数范围为1~64,测试一下:
浮点数类型
float
float[(m, d)] [unsigned] : M指定显示长度,d指定小数位数,占用空间4个字节
例子:
4表示浮点数中有四位,2表示小数点后有两位,比如36.51,3,6,5,1四位,小数点后面有两位51。因为没有带unsigned,范围为-99.99~99.99
插入数据:
如果插入超出范围的:
当插入数据在范围内,但是小数位没有给够,会自动帮你补全:
如果插入的数据在范围内,小数位数给多了,会进行四舍五入
如果是99.994四舍五入后在范围内,如果是99.995,四舍五入后超出范围就不能插入。
创建无符号float:
插入数据:
unsigned float会将负数部分去除留下0和>0;
mysql中float是否会有精度损失?
修改一下float精度
插入数据:
可以保证最大精度为6位,我们可以用另外一种类型来避免精度损失,这个类型就是decimal.
decimal
decimal(m, d) [unsigned] : 定点数m指定长度,d表示小数点的位数
例子:
两个类型,一个float为10位,小数为8位,一个是decimal为4位,小数为2位。
插入数据:
可以看到,基本和float差不多。
修改decimal精度:
float和decimal插入相同的值:
明显decimal精度很高。
字符串类型
char
char(L): 固定长度字符串,L是可以存储的长度,单位为字符,最大长度值可以为255
例子:
name类型为char(2),也就是能存放两个字符.
插入数据:
‘abc’发现不行
显示一下:
再次插入些数据:
在utf8中,一个汉字占3个字节,而GBK中一个汉字占两个字节,而这里的中国占了六个字节还能插入,所以说char中单位为字符,而非字节.
边界测试:
varchar
varchar(L): 可变长度字符串,L表示字符长度,最大长度65535个字节
例子:
插入数据:
因为刚才最大字节是65535,所以我们可以长度修改为65535吗?
这里最大为16383,这是什么?
这里字符集用的是utf8mb4,
16383*4=65532,也就是最大插入字符数为16383,可以试试:
上面写着一行不能太大,一行就代表一次插入的记录,包括int,四个字节,
说明:
关于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字节)。
因为有一次插入数据的别的类型干扰
重新建表:
这里一次插入只有name,没有其他变量,编码字符集也用utf8
char和varchar比较
如何选择定长或变长字符串?
如果数据确定长度都一样,就使用定长(char),比如:身份证,手机号,md5
如果数据长度有变化,就使用变长(varchar), 比如:名字,地址,但是你要保证最长的能存的进去。
定长的磁盘空间比较浪费,但是效率高。
变长的磁盘空间比较节省,但是效率低。
定长的意义是,直接开辟好对应的空间
变长的意义是,在不超过自定义范围的情况下,用多少,开辟多少。
解释这里abcd存储,为啥varchar要加1个字节,因为要保存abcd的总长度,所以用一个字节即可.
日期和日期类型
常用的日期有如下三个:
date :日期 ‘yyyy-mm-dd’ ,占用三字节
datetime 时间日期格式 ‘yyyy-mm-dd HH:ii:ss’ 表示范围从 1000 到 9999 ,占用八字节
timestamp :时间戳,从1970年开始的 yyyy-mm-dd HH:ii:ss 格式和 datetime 完全一致,占用
四字节
例子:
更新数据:
enum和set
语法:
enum:枚举,“单选”类型;
enum(‘选项1’,‘选项2’,‘选项3’,…);
该设定只是提供了若干个选项的值,最终一个单元格中,实际只存储了其中一个值;而且出于效率考
虑,这些值实际存储的是“数字”,因为这些选项的每个选项值依次对应如下数字:1,2,3,…最多65535
个;当我们添加枚举值时,也可以添加对应的数字编号。
set:集合,“多选”类型;
set(‘选项值1’,‘选项值2’,‘选项值3’, …);
该设定只是提供了若干个选项的值,最终一个单元格中,设计可存储了其中任意多个值;而且出于效率
考虑,这些值实际存储的是“数字”,因为这些选项的每个选项值依次对应如下数字:1,2,4,8,16,32,…
最多64个。
说明:不建议在添加枚举值,集合值的时候采用数字的方式,因为不利于阅读。
例子:
有一个调查表votes,需要调查人的喜好, 比如(登山,游泳,篮球,武术)中去选择(可以多选),(男,女)[单选]
插入数据:
按照性别查找女生:
查找所有下棋的人:
不能查出有一项为下棋的人,如果要查出有下棋的人:
使用集合查询find_in_set函数:
find_in_set(sub,str_list) :如果 sub 在 str_list 中,则返回下标;如果不在,返回0;
str_list 用逗号分隔的字符串。
查询爱好登山的人: