1. 数据类型分类
2. 数值类型
2.1 tinyint类型
在MySQL,整型可以指定是有符号的和无符号的,默认是有符号的。
可以通过UNSIGNED来说明某个字段是无符号的
create table tt2(num tinyint unsigned);
insert into tt2 values(1);
insert into tt2 values(-1); -- 无符号,范围是0-255,此处报错
尽量不使用unsigned,对于int类型可能存放不下的数据,int unsigned同样可能存放不下,与其如 此,还不如设计时,将int类型提升为bigint类型。
2.2 bit类型
bit(M) : 位字段类型。M表示每个值的位数,范围从1到64.如果M被忽略,默认为1.
create table tt3(id int, a bit(8));
insert into tt3 values(10,10);
insert into tt3 values(65,65);
select * from tt3;
此处a的数据10没有出现,bit字段在显示时,是按照ASCII对于的值显示。
如果我们有一个值只存放0或1,此时可以定义bit(1)。这样可以节省空间。当插入2时,已经越界了。
2.3 小数类型
- float
float(m,d):m指定显示长度,d指定小数位数,占用空间4个字节
float(4,2):表示的范围是-99.99~99.99,MySQL在保存值时会进行四舍五入。
create table tt5 (num int, salary float(4,2));
insert into tt5 values(1,99.99);--OK
insert into tt5 values(1,99.994);--OK
insert into tt5 values(1,99.995);--ERROR,越界
- decimal
decimal(m,d) [unsigned]:定点数m指定长度,d表示小数点的位数
decimal(5,2)表示的范围是-999.99~999.99
decimal(5,2) unsigned 表示的范围0~999.99
decimal和float很像,但是还是有区别的:
float和decimal精度不一样
decimal的精度更准确,
float表示的精度大约是7位;
decimal整数最大位数m为65.支持小数最大位数d是30。如果d被省略,默认为0;如果m被忽略,默认是10。
3. 字符串类型
3.1 char
char(L):固定长度字符串,L是可以存储的长度,单位为字符,最大长度值可为255
假设char(2),可以插入'ab','中国',即可以是字母或者汉字但是不能超过两个,可以少于两个。
3.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.3 char和varchar比较
如何选择char或varchar?
- 如果数据确定长度都一样,就用char;如:身份证,手机号,md5
- 如果数据长度有变化,就使用varchar, 比如:名字,地址,但是你要保证最长的能存的进去。
- char的磁盘空间比较浪费,但是效率高。
- varchar的磁盘空间比较节省,但是效率低。
4. 日期和时间类型
- datetime 时间日期格式 ‘yyyy-mm-dd HH:ii:ss’ 表示范围从1000到9999,占用八字节
- date:日期’yyyy-mm-dd’,占用三字节
- timestamp:时间戳,从1970年开始的 yyyy-mm-dd HH:ii:ss格式和datetime完全一致,占用四字节,添加数据时,时间戳自动补上当前时间。
create table birthday (t1 date, t2 datetime, t3 timestamp);
insert into birthday(t1,t2) values('1997-7-1','2008-8-8 12:1:1');
select * from birthday;
更新数据:
update birthday set t1='2001-1-5';
select * from birthday;
5. enum和set
- enum:枚举,“单选”类型;
- enum(‘选项1’,‘选项2’,‘选项3’,…);
该设定只是提供了若干个选项的值,最终一个单元格中,实际只存储了其中一个值;而且出于效率考虑,这些值实 际存储的是“数字”,因为这些选项的每个选项值依次对应如下数字:1,2,3,…最多65535个;当我们添加枚举值时, 也可以添加对应的数字编号。 - set:集合,“多选”类型;
- set(‘选项值1’,‘选项值2’,‘选项值3’, …);
该设定只是提供了若干个选项的值,最终一个单元格中,设计可存储了其中任意多个值;而且出于效率考虑,这些 值实际存储的是“数字”,因为这些选项的每个选项值依次对应如下数字:1,2,4,8,16,32,… 最多64个。
create table votes(
username varchar(30),
hobby set('登山','游泳','篮球','武术'),
gender enum('男','女')
);
insert into votes values('雷锋', '登山,武术', '男');
insert into votes values('Juse','登山,武术',2);
insert into votes values('Lilei','登山',2);
查找爱好登山的人
select * from votes where hobby='登山';
可以看到此时不能找出所有爱好登山的人,此时需要引入集合查询函数find_in_set(sub,str_list)
select * from votes where find_in_set('登山', hobby);