bit[(M)] : 位字段类型。M表示每个值的位数,范围从1到64。如果M被忽略,默认为1。
例:
//表tt3的sno的值有8个位
mysql> create table tt3(age int,sno bit(8));
//插入数据
mysql> insert into tt3 values(10,24);
//查询数据 sno的值24并不是24
mysql> select * from tt3;
是因为bit字段在显示时,是按照ASCII码对于的值显示。验证如下:
//65是A的ASCII码
insert into tt3 values(11,65);
//这样sno字段数据以十进制显示:
mysql select sno+0 from tt3;
mysql select hex(sno) from tt3;
mysql> select oct(sno) from tt3;
但是mysql使用上述函数时无法使用索引。
字段值以二进制显示:
mysql> select bin(sno) from tt3;
//bit默认1位
mysql> create table tt4(judge bit);
mysql> insert into tt4 valus(0);
mysql> insert into tt4 values(1);
插入数据为2时,会出现错误:
2.tinyint
tinyint默认为有符号为1个字节,那么取值范围是-128-127,如果数据大于127就会越界:
在MySQL中,整型可以指定为有符号和无符号,如果没有指定,默认为有符号,但是可以通过UNSIGNED来指定某个字段是无符号的。
添加一个新字段age2,为tinyint unsigned:
mysql> alter table tt2 add age2 tinyint unsigned ;
mysql> insert into tt2(ag2) values (128);
我们知道无符号和有符号相差一个数量级,如果有符号int超范围,int unsigned同样可能存放不下,所以在设计时数据过大,可以设计为bigint。
3.小数类型(float/decimal)
float[(m, d)] [unsigned] : m指定显示长度,d指定小数位数,占用空间4个字节
有符号float:
float(4,2)表示的范围是-99.99 ~ 99.99,MySQL在保存值时会进行四舍五入。
//area值是4位数,小数位2位
mysql> create table tt5(area float(4,2));
//会进行四舍五入
mysql> insert into tt5 values(99.991);
mysql> insert into tt5 values(99.985);
无符号float
float(4,2) unsigned 这时,因为把它指定为无符号的数,范围是 0 ~ 99.99。
mysql> create table tt6(area float(4,2) unsigned);
mysql> insert into tt6 values(-1);
decimal(m, d) [unsigned] : 定点数m指定长度,d表示小数点的位数
float和decimal的区别在于精度不同
mysql> create table tt7(area float(10,8),salary decimal(10,8));
mysql> insert into tt7 values(53.12345678,53.12345678);
三.字符串类型
char
语法:
char(L): 固定长度字符串,L是可以存储的长度,单位为字符,最大长度值可以为255
//char(2)代表可以存储的长度为2
mysql> create table tt8 (name char(2));
mysql> insert into tt8('ab');
mysql> insert into tt8 values('中国');
char(2)表示可以存放2个字符,可以是字母或者汉字,但是不能超过2个,最多只能是255;
varchar
mysql> create table tt9 (name char(256));
mysql> insert into tt10 values("hello");
mysql> insert into tt10 values("中国,你好!");
关于varchar(len),len到底是多大,这个len值,和表的编码密切相关:
varchar的最大长度是65535。
但是MySql限定行的最大值是65535字节(byte),注意,这是行的最大长度,包括一行中所有列的长度总和,但是但是有1 - 2 个字节用于记录数据大小,所以说有效字节数是65533。
对于char,不论采用哪一种字符集(utf8mb4一个字符4个字节),255的长度都不会超过mysql 65535字节的限制。然而对于varchar,字符集的大小就会对实际长度产生影响:
当我们的表的编码是utf8时,varchar(n)的参数n最大值是65533/3=21844(因为utf中,一个字符占用3个字节),如果编码是gbk,varchar(n)的参数n最大是65533/2=32766(因为gbk中,一个字符占用2字节)。
如何选择定长或变长?
首先了解下什么是变成定长:
变长定长区别体现在存储方式上。char 作为定长类型,假设定义 char(10),我们存入’中国’,只占用了2个字符数,那么后面8个字符,存储引擎会填充空格。反之varchar(10),不会自动填充空格。即varchar是变长。
日期和时间类型
日期
mysql> create table tt11(t1 date,t2 datetime,t3 timestamp);
mysql> insert into tt11(t1,t2) values ('2000-1-1','2008-12-7 8:1:1');
mysql> insert into tt11(t1,t2) values ('2009-1-1','2018-12-7 10:19:0');
如果没有指定时间戳,时间戳默认为当前时间。
enum和set
enum
语法:
//enum是单选
enum('选项1','选项2','选项3',...);
提供了若干选项的值,一次只能选择一个,和c里的枚举一样,每个选项实际存储的是数字,1,2,3,4…最大65535。
set
语法:
//set是多选
set('选项值1','选项值2','选项值3', ...);
set里提供了若干选项的值,一次可以有多个选项,每个选项值实际存储的是数字,1,2,4,8,16…最大是64。
尽管enum和set存储的数字,但是在添加数据时,最好用具体含义,可读性强。
例:调查男生女生喜欢的颜色(粉色,果绿,紫色);
//创建表
mysql> create table tt12(
-> name varchar(20),
-> colour set('粉红','果绿','紫色'),
-> sex enum('male','female'));
mysql> insert into tt12 values("pick","紫色","male");
mysql> insert into tt12 values("sophia",'紫色,果绿',"male");
mysql> select * from tt12 where colour='紫色';
只查询到唯一喜欢紫色的信息,并没有把喜欢紫色同学信息全部查询到,所以用到了find_ in_ set。
集合查询使用find_ in_ set函数:
find_in_set(sub,str_list) :如果 sub 在 str_list 中,则返回下标;如果不在,返回0; str_list 用逗号分隔的字符串。
mysql> select * from tt12 where find_in_set('紫色',colour);