目录
一、MySQL数据类型分类
二、数值类型
1、整数类型
2、bit类型
3、小数类型
三、字符串类型
1、char
2、varchar
3、char和varchar比较
四、日期和时间类型
五、enum和set
MySQL 数据类型可以大致分为以下三类:
这里用MySQL的tinyint类型举例,来说明整数类型的用法
mysql> create table tt1(num tinyint);
mysql> insert into tt1 values(1);
mysql> insert into tt1 values(128); //-- 越界插入,报错
mysql> select * from tt1;
mysql> create table tt2(num tinyint unsigned);
mysql> insert into tt2 values(-1); //-- 无符号,范围是: 0 - 255
mysql> insert into tt2 values(255);
mysql> select * from tt2;
注意:使用有符号的和无符号是根据业务要求来选择的,没有哪种更好的说法。
基本语法
bit(M) : 位字段类型。M表示每个值的位数,范围从1到64。如果M被忽略,默认为1。
mysql> create table tt4 ( id int, a bit(8));
mysql> insert into tt4 values(10, 10);
mysql> select * from tt4;
我们发现发现很怪异的现象,a的数据10没有出现,这是因为bit字段在显示时,是按照ASCII码对应的值显示。
示例:
mysql> insert into tt4 values(65, 65);
mysql> insert into tt4 values(65, 'A');
mysql> select * from tt4;
mysql> create table tt5(gender bit(1));
mysql> insert into tt5 values(0);
mysql> insert into tt5 values(1);
mysql> insert into tt5 values(2); //会发生越界
1、float类型
语法:float[(m, d)] [unsigned] : M指定数字位数总长度,d指定小数位数,占用空间4个字节
//m和n根据需求设置
示例:
mysql> create table tt6(id int, salary float(4,2));
mysql> insert into tt6 values(100, -99.99);
mysql> insert into tt6 values(101, -99.991); //多的这一点会四舍五入
mysql> select * from tt6;
四舍五入后如果数字超过范围,数据插入会失败。
create table tt7(id int, salary float(4,2) unsigned);
mysql> insert into tt7 values(100, -0.1);
mysql> insert into tt7 values(100, 99.99);
2、decimal类型
语法:decimal(m, d) [unsigned] : 定点数m指定长度,d表示小数点的位数
decimal和float都是用来表示小数的数据类型,但它们有不同的特点和用途。
decimal是一种定点数,它用128位二进制来存储一个十进制数,可以保证小数的精度不会丢失,常用于金融运算或者要求高精度的场合。
示例:
mysql> create table tt8 ( id int, salary float(10,8), salary2 decimal(10,8));
mysql> insert into tt8 values(100,23.12345612, 23.12345612);
mysql> select * from tt8;
语法:char(L): 固定长度字符串,L是可以存储的长度,单位为字符,最大长度值可以为255
//这里的字符不是C或者C++的字符,而是一个符号,比如数字、字母或者汉字等等
create table tt9(id int, name char(2));
mysql> insert into tt9 values(100, 'ab');
mysql> insert into tt9 values(101, '字符');
mysql> insert into tt9 values(101, '123');
语法:varchar(L): 可变长度字符串,L表示字符长度,最大长度65535个字节
//注意这里是字节,不是字符
示例:
mysql> create table tt10(id int ,name varchar(6)); //表示这里可以存放6个字符
mysql> insert into tt10 values(100, 'hello');
mysql> insert into tt10 values(100, '我爱你,中国');
mysql> select * from tt10;
mysql> create table tt11(name varchar(21845))charset=utf8; //验证utf8确实是不
能超过21844
mysql> create table tt11(name varchar(21844)) charset=utf8;
我们再来新建一张表,这次我们在tt11的基础上加一个id列,结果我们发现失败了
create table tt12(id int,name varchar(21844))charset=utf8;
ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs
可是就目前来看,varchar除了范围比char大一点,它们还有什么区别吗?我们接着往下看
那么如何选择char和varchar呢?可以根据以下几点
date : 日期 'yyyy - mm - dd' ,占用三字节datetime 时间日期格式 'yyyy - mm - dd HH:ii:ss' 表示范围从 1000 到 9999 ,占用八字节timestamp :时间戳,从 1970 年开始的 yyyy - mm - dd HH:ii:ss 格式和 datetime 完全一致,占用四字节
mysql> create table birthday (t1 date, t2 datetime, t3 timestamp);
mysql> insert into birthday(t1,t2) values('2001-12-07','2001-01-01 12:00:00');
mysql> select * from birthday;
mysql> update birthday set t1='1999-12-07';
mysql> select * from birthday;
示例:
mysql> create table votes(
-> name varchar(32),
-> gender enum('男','女'),
-> hobby set('游戏','动漫','音乐')
-> );
现在往表里添加数据,添加数据时可以直接写入选项,也可以用下标(enum)或者用位图(set)来表示。
mysql> insert into votes values('kevin','男','游戏,音乐');
mysql> insert into votes values('kiana','2',3);
mysql> select*from votes;
可以发现,set的1,2,3......不是下标,而是要看成由01组成的位图,是1就表示选中。
查询数据示例:
select*from votes where hobby='游戏';
find_in_set函数的语法是:find_in_set(str, strlist),其中str是要查找的字符串,strlist是由逗号分隔的字符串列表。例如,find_in_set(‘b’, ‘a,b,c,d’)返回2,因为’b’在’a,b,c,d’中的位置是2。
find_in_set函数可以用在where子句中,来筛选出满足某个条件的记录。例如,如果有一个表test1,其中有一个字段list,存储了一些由逗号分隔的值,如’篮球,足球,羽毛球’,那么可以用find_in_set函数来查询出包含’足球’的记录。
mysql> select*from votes where find_in_set('动漫',hobby);
mysql> select*from votes where find_in_set('游戏',hobby) and find_in_set('动漫',hobby);