MySQL数据库类型——包括数据类型、文本、二进制类型、时间日期、String等,会对数值进行越界测试
1.数据类型分类
2.数值类型
2.1 数值类型(通过tinyint来说明)
对这个类型进行越界测试,首先创建一个数据库,然后建表。
create database text1;
use text1;
create table t1(num tinyint);
向text1这个表里插入数据
可以看到当数据小于-128时以及数据大于127时插入会失败,并且插入小数会四舍五入为整数
在MySQL里整型可以指定是有符号的或者无符号的,默认是有符号的
可以通过unsigned来说明某个字段是无符号的
案例:
可以看到无符号的数据范围是0到255。
2.2 bit类型
基本语法:
bit[(M)] : 位字段类型。M表示每个值的位数,范围从1到64。如果M被忽略,默认为1。
案例:我们创建一张表里面有一个id和a类型分别为int和bit(8)
create table tt4 ( id int, a bit(8));
向这张表插入(19,10)
insert into t3 values(19,10);
查看表内的内容
我们发现10并没有显示出来,这是因为bit字段在显示的时候是按ASCLL码对应的值显示的
2.3 小数类型
2.3.1 float
语法:
float[(m, d)] [unsigned] : M指定显示长度,d指定小数位数,占用空间4个字节
案例:float(4,2)表示的范围是-99.99到99.99,MySQL在保存值时会四舍五入
案例:如果定义的时float(4,2) unsigned这是他的范围时0到99.99
2.3.2 decimal
语法:
decimal(m, d) [unsigned] : 定点数m指定长度,d表示小数点的位数
decimal的用法和float很像但是区别在于float在保存数据时存在因为精度问题导致数据误差较大。但是decimal并没有这个问题他的精度很大。
2.4 字符串类型
2.4.1 char
语法:
char(L): 固定长度字符串,L是可以存储的长度,单位为字符,最大长度值可以为255
注意:MySQL里的一个字符并不是我们在写c++时的那个一个字符1个字节,而是真正的一个字符如:“中”是一个字符,所以MySQL里的字符并不是一个字节
案例:创建一个表包含id和name其中name的类型是char(2)向这个表插入数据
2.4.2 varchar
语法:
varchar(L): 可变长度字符串,L表示字符长度,最大长度65535个字节
使用方法和char差不多
下面关于varchar(len)的len到底有多大进行一个说明
1.varchar长度(指字节)可以指定为0到65535之间的值,但是有1 - 3 个字节用于记录数据大小,所以说有效字 节数是65532。
2.当我们的表的编码是utf8时,varchar(n)的参数n最大值是65532/3=21844[因为utf中,一个字符占用3个字节],如果编码是gbk,varchar(n)的参数n最大是65532/2=32766(因为gbk中,一个字符 占用2字节)。
2.4.3 char和varchar比较
如何选择变长或定长字符串
1.如果数据确定长度都一样,就使用定长(char),比如:身份证,手机号,md5
2.如果数据长度有变化,就使用变长(varchar), 比如:名字,地址,但是你要保证最长的能存的进去。
3.定长的磁盘空间比较浪费,但是效率高。
4.变长的磁盘空间比较节省,但是效率低。
5.定长的意义是,直接开辟好对应的空间变长的意义是,在不超过自定义范围的情况下,用多少,开辟多少。
2.5 日期和时间类型
常用的日期有如下三个: date :日期 'yyyy-mm-dd' ,占用三字节
datetime 时间日期格式 'yyyy-mm-dd HH:ii:ss' 表示范围从 1000 到 9999 ,占用八字节
timestamp :时间戳,从1970年开始的 yyyy-mm-dd HH:ii:ss 格式和 datetime 完全一致,占用
四字节
说明:timestamp不需要输入他会根据同一行数据最后被修改的时间来自动更新
案例:创建一个表含义date、datetime、timestamp,插入t1和t2的值观察t3
2.6 enum和set
语法:
enum:枚举,“单选”类型;
enum('选项1','选项2','选项3',...);
该设定只是提供了若干个选项的值,最终一个单元格中,实际只存储了其中一个值;而且出于效率考 虑,这些值实际存储的是“数字”,因为这些选项的每个选项值依次对应如下数字:1,2,3,....最多65535 个;当我们添加枚举值时,也可以添加对应的数字编号。
set:集合,“多选”类型;
set('选项值1','选项值2','选项值3', ...);
该设定只是提供了若干个选项的值,最终一个单元格中,设计可存储了其中任意多个值;而且出于效率 考虑,这些值实际存储的是“数字”,因为这些选项的每个选项值依次对应如下数字:1,2,4,8,16,32,.... 最多64个。
你可以理解set实际是一张位图通过1,2,4,...,64这些数来进行位操作
案例: 有一个调查表votes,需要调查人的喜好, 比如(登山,游泳,篮球,武术)中去选择(可以多选), (男,女)[单选]
插入数据后查找gender=2的行
对于set类型我们可以用find_in_set函数查找想要的信息
案例:
目前我们有这些数据
查找爱好有武术的人