数值类型
注: mysql不区分大小写
当定义数据类型后 ,插入的 数据需要遵循数据类型的约束。
创建一个有符号的数据类型 :
create table t1 (num int );
创建一个无符号的数据类型:
create table t2 (num int unsigned);
在添加数据时,如果超出数据类型所允许的范围,mysql服务会拦截命令语句。
bit 类型
bit[(M)] : 位字段类型。M表示每个值的位数,范围从1到64。如果M被忽略,默认为1。
create table tt4 ( id int, a bit(8)); insert into tt4 values(10, 10);
查看表,我们发现,a的数据10没有出现。
再次插入,
insert into tt4 values(65,65);
查看
发现a位置的65 变为了 ‘A’,我们可知:
bit字段在显示时,是按照ASCII码对应的值显示
同时,bit类型插入数值时也受其本身大小约束。
小数类型
float
float[(m, d)] [unsigned] : M指定显示长度,d指定小数位数,占用空间4个字节
小数:float(4,2)表示的范围是-99.99 ~ 99.99,MySQL在保存值时会进行四舍五入。
操作:
create table t2(id int,num float(4,2)); insert into t2 values(1,99.99); insert into t2(id,num) values(2,-99.99); insert into t2 values(2,99.994);
查看:
插入99.996 等数字时,ERROR 1264 (22003): Out of range value ,mysql会约束你。
decimal
decimal(m, d) [unsigned] : 定点数m指定长度,d表示小数点的位数
deciaml 和float 很像,但是有区别,它们的精度不一样。
decimal的精度更准确,因此如果我们希望某个数据表示高精度,选择decimal
字符串类型
char
char(L): 固定长度字符串,L是可以存储的长度,单位为字符,最大长度值可以为255
注意: char的单位是字符,不是字节,一个字符可以表示任意一个在字符集里的字符,
一个汉字和一个英文字母都表示为一个字符
char(2) 表示可以存放两个字符。
varchar
varchar(L): 可变长度字符串,L表示字符长度,最大长度65535个字节
varchar的L表示的是字节数。所以,varchar的最大长度和编码字符集有关系。
- varchar长度可以指定为0到65535之间的值,但是有1 - 3 个字节用于记录数据大小,所以说有效字节数是65532。
- 当我们的表的编码是utf8时,varchar(n)的参数n最大值是65532/3=21844[因为utf中,一个字符占用3个字节],如果编码是gbk,varchar(n)的参数n最大是65532/2=32766(因为gbk中,一个字符占用2字节)
但是,我们看报错:
row size too large,说明65535字节是表一行的最大长度,因此受表中定义的其它数据影响,达不到其最大长度。
varchar 的可变体现在,当设置了L长度后,插入的数据占据内存的大小等于数据的实际大小而不是你设置的规定的L,而char插入的大小就是设置的大小;
日期和时间类型
date :日期 ‘yyyy-mm-dd’ ,占用三字节
datetime 时间日期格式 'yyyy-mm-dd HH:ii:ss’表示范围从 1000 到 9999 ,占用八字节
timestamp :时间戳,从1970年开始的 yyyy-mm-dd HH:ii:ss格式和 datetime 完全一致,占用 四字节
data 和datatime 都是固定的。
添加数据时,时间戳(timestamp)自动添加当前时间,修改数据时,时间戳也会自动修改为当前时间。
enum和set
enum:枚举,“单选”类型;
enum(‘选项1’,‘选项2’,‘选项3’,…);
该设定只是提供了若干个选项的值,最终一个单元格中,实际只存储了其中一个值;而且出于效率考虑,这些值实际存储的是“数字”, 值依次对应如下数字:1,2,3,…
set:集合,“多选”类型;
set(‘选项值1’,‘选项值2’,‘选项值3’, …);
create table t5( -> name varchar(20), -> sex enum('男','女'), -> hobby set('学习','游戏','爬山','代码','恋爱') -> );
创建表结构,
正常插入 :
insert into t5 values('张三','男','学习'); insert into t5 values('李四','女','游戏'); insert into t5 values('王五','男','游戏,爬山');
数字插入:
insert into t5 values('赵六',2,0); insert into t5 values('赵六',2,1); insert into t5 values('赵六',2,2); insert into t5 values('赵六',1,4); insert into t5 values('赵六',1,7); insert into t5 values('赵六',1,31);
可知,enum的下标从1开始,一一对应。
set的数字表示的是一个位图结构,当为0时,插入为空,当为31时,二进制表示为11111,所以选的是位图的前五个选项。
集合查询使用find_ in_ set函数:
查上表中爱好有学习的人的信息:
select * from t5 where find_in_set('学习',hobby);
查表中爱好只有学习的人:
select * from t5 where hobby='学习';