🔥个人主页🔥:孤寂大仙V
🌈收录专栏🌈:MySQL
🌹往期回顾🌹:【MySQL笔记】库操作与表操作
🔖流水不争,争的是滔滔不
一、数据类型分类
二、tinyint类型
无符号类型
无符号类型范围是0-255
以下演示创建的表全在test2库中,tinyint类型表名称为t1。
以下示例是在无符号类型的情况下进程插入,插入范围在0-255都没有问题
insert into t1 values(1); //向表中插入数据
insert into t1 values(255);
select * from t1; //查看表内容
以下示例是插入不合法示例
insert into t1 values(-1);
insert into t1 values(256);
带符号类型
带符号类型方位是-128 ~ 127
以下演示创建的表全在test2库中,tinyint类型,表名称为t2。
以下示例是在带符号类型的情况下进程插入,插入范围在-128~127都没有问题
mysql> insert into t2 values(-128); //在范围内
mysql> insert into t2 values(127);
mysql> insert into t2 values(-129); //不在范围内
ERROR 1264 (22003): Out of range value for column 'num' at row 1
mysql> insert into t2 values(128);
ERROR 1264 (22003): Out of range value for column 'num' at row 1
注意:尽量不使用unsigned,对于int类型可能存放不下的数据,int unsigned同样可能存放不
下,与其如此,还不如设计时,将int类型提升为bigint类型。
三、bit和int类型
bit(M)是位类型,M指定位数,默认值是1,范围是1-64。
int类型,带符号是-2的31次方到2的31次方-1,无符号是2的16次方-1。
以下示例是在t3表下完成。
向表内插入数据
mysql> insert into t3 (id,online) values (128,0);
Query OK, 1 row affected (0.01 sec)
mysql> insert into t3 (id,online) values (129,1);
Query OK, 1 row affected (0.00 sec)
发现online这一列不是所插入的对应的数据,而是ascll码值。
select id,hex(online) from t3;//通过这种方式显示数据
int没什么好说的正常使用就可以了
四、小数类型
float
有符号类型
语法: float[(m, d)] : M指定显示长度,d指定小数位数,占用空间4个字节
以下是在t4表下进行演示
mysql> insert into t4 (id,salary) values (128,20.76); //向表中插入数据
Query OK, 1 row affected (0.02 sec)
mysql> insert into t4 (id,salary) values (91,99.99);
Query OK, 1 row affected (0.01 sec)
mysql> insert into t4 (id,salary) values (21,-99.99);
Query OK, 1 row affected (0.00 sec)
MySQL在保存值时会进行四舍五入。
mysql> insert into t4 (id,salary) values (11,9.213);
Query OK, 1 row affected (0.00 sec)
mysql> insert into t4 (id,salary) values (22,9.218);
Query OK, 1 row affected (0.01 sec)
无符号类型
如果定义的是float(4,2) unsigned 这时,因为把它指定为无符号的数,范围是 0 ~ 99.99。
以下演示是在t5表内
decima
语法:decimal(m, d) [unsigned] : 定点数m指定长度,d表示小数点的位数。
decimal和float很像,但是有区别: float和decimal表示的精度不一样。
比如:
decimal(5,2) 表示的范围是 -999.99 ~ 999.99
decimal(5,2) unsigned 表示的范围 0 ~ 999.99
以下演示在t6中进行操作
mysql> insert into t6 (f1,f2) values (23.46523451,24.38);
Query OK, 1 row affected (0.00 sec)
我们发现,float类型的f1精度不准后几位不正确,f2不会发生进位的情况。
我们改下decimal类型的小数个数
发现decimal的精度更准确,因此如果我们希望某个数据表示高精度,选择decimal。
说明:float表示的精度大约是7位。
decimal整数最大位数m为65。支持小数最大位数d是30。如果d被省略,默认为0.如果m被省略,
默认是10。
无符号类型只是正负的差异,不做过多演示
五、字符串类型
char类型
语法:char(L): 固定长度字符串,L是可以存储的长度,单位为字符,最大长度值可以为255。
以下演示在t7表中进行操作
插入数据
mysql> insert into t7 (id,name) values (1,a);
ERROR 1054 (42S22): Unknown column 'a' in 'field list'
mysql> insert into t7 (id,name) values (1,'a');
Query OK, 1 row affected (0.00 sec)
mysql> insert into t7 (id,name) values (1,'b');
Query OK, 1 row affected (0.00 sec)
mysql> insert into t7 (id,name) values (1,'ab');
Query OK, 1 row affected (0.01 sec)
mysql> insert into t7 (id,name) values (1,'abc');
ERROR 1406 (22001): Data too long for column 'name' at row 1
发现abc超过三个字符插入不了
下面插入中国汉字
mysql> ^C
mysql> insert into t7 (id,name) values (2,'中');
Query OK, 1 row affected (0.01 sec)
mysql> insert into t7 (id,name) values (2,'中国');
Query OK, 1 row affected (0.01 sec)
mysql> insert into t7 (id,name) values (2,'中国人');
ERROR 1406 (22001): Data too long for column 'name' at row 1
在mysql中一个中国汉字可以当作一个char
varchar类型
语法:varchar(L): 可变长度字符串,L表示字符长度,最大长度65535个字节
以下演示在t8表中进行操作
mysql> insert into t8 (id,name) values (1,'中国人民万岁');
Query OK, 1 row affected (0.00 sec)
当我们修改varchar长度的时候发现最大长度是16383,但是上面不是说过最大时65535吗?
上面说的时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字节)。
char和var的比较
- 如果数据确定长度都一样,就使用定长(char),比如:身份证,手机号,md5
- 如果数据长度有变化,就使用变长(varchar), 比如:名字,地址,但是你要保证最长的能存的进去。
- 定长的磁盘空间比较浪费,但是效率高。
- 变长的磁盘空间比较节省,但是效率低。
- 定长的意义是,直接开辟好对应的空间
- 变长的意义是,在不超过自定义范围的情况下,用多少,开辟多少。
日期类型和时间类型
常用的日期有如下三个:
- date :日期 ‘yyyy-mm-dd’ ,占用三字节
- datetime 时间日期格式 ‘yyyy-mm-dd HH:ii:ss’ 表示范围从 1000 到 9999 ,占用八字节
- timestamp :时间戳,从1970年开始的 yyyy-mm-dd HH:ii:ss 格式和 datetime 完全一致,占用
四字节
以下演示在t9表中进行操作
insert into t9 (data,datetime) values ('2000-10-01','1949-10-01 08:00:00');
六、enum和set
语法:
enum:枚举,“单选”类型;
enum(‘选项1’,‘选项2’,‘选项3’,…);
该设定只是提供了若干个选项的值,最终一个单元格中,实际只存储了其中一个值;而且出于效率考
虑,这些值实际存储的是“数字”,因为这些选项的每个选项值依次对应如下数字:1,2,3,…最多65535
个;当我们添加枚举值时,也可以添加对应的数字编号。
set:集合,“多选”类型;
set(‘选项值1’,‘选项值2’,‘选项值3’, …);
该设定只是提供了若干个选项的值,最终一个单元格中,设计可存储了其中任意多个值;而且出于效率考虑,这些值实际存储的是“数字”,因为这些选项的每个选项值依次对应如下数字1,2,4,8,16,32,… 最多64个。
以下演示在t10表中进行
mysql> insert into t10 (username,gender,bobby) values('张三','男','代码');
Query OK, 1 row affected (0.01 sec)
mysql> insert into t10 (username,gender,bobby) values('李四','女','代码');
Query OK, 1 row affected (0.00 sec)
mysql> insert into t10 (username,gender,bobby) values('王五',1,'代码');
Query OK, 1 row affected (0.00 sec)
mysql> insert into t10 (username,gender,bobby) values('赵六',2,'代码');
Query OK, 1 row affected (0.00 sec)
枚举类型 gender只能插入里面有的,比如上图只能插入男或者女。也可以写常量的下标,下标从1开始。
mysql> insert into t10 (username,gender,bobby) values('小帅',1,'代码,蓝球,羽毛球');
Query OK, 1 row affected (0.00 sec)
集合中不可以插入,集合中不存在的类型。可以多个插入也可以单个插入。
查询性别位女的人
select * from t10 where gender =2;
严格筛选
比如就要有只有代码和羽毛球的
mysql> select * from t10 where bobby='代码,羽毛球';
要想查询所有喜欢羽毛球的怎么操作呢?
集合查询使用find_ in_ set函数:
find_in_set(sub,str_list) :如果 sub 在 str_list 中,则返回下标;如果不在,返回0;
str_list 用逗号分隔的字符串。
先讲一下这个函数
在a,b,c中找a找到了,在返回a的小标。找d不在,返回0。
mysql> select * from t10 where find_in_set('羽毛球',bobby);
这样就把包含羽毛球的筛选出来了。