数据类型分类
数值类型
tinyint类型
- 以
tinyint
为例- 所有数值类型默认都是有符号的,无符号的需要在后面加
unsigned
tinyint
的范围在-128~127之间- 无符号的范围在0~255之间(类比char)
create database test_db;
use test_db;
建表时一定要跟着写上属性
mysql> create table if not exists t1(
-> num tinyint
-> );
//查看
desc t1;
show tables;
show create table t1\G;
//无符号整数
mysql> create table if not exists t2(
-> num tinyint unsigned
-> );
注意:
- 尽量不使用unsigned,对于int类型可能存放不下的数据,int unsigned同样可能存放不下。
- 与其如此,还不如设计时,将int类型提升为bigint类型,根据自身使用场景,选择合适的数据类型即可。
- 如果我们向mysql特定的类型中插入不合法的数据,mysql一般都是直接拦截,不让我们做对应的操作,与C不同,C会截断再存储
- 反过来,如果我们有数据已经成功插入到mysql中,一定是合法得到
- 所以,mysql中,一般而言,数据类型本身就是一种约束,约束的是程序员
- 这保证了数据库中的数据是可预期的,完整的
- mysql表中建立属性列,列名称在前,类型在后
bit类型
bit[(M)] : 位字段类型。M表示每个值的位数,**范围从1到64**。如果M被忽略,默认为1
mysql> create table if not exists t3(
-> id int,
//一个bit位,只能插0或插1
-> online bit(1)
-> );
- online 是位类型,以ASCII码值显示,ASCII码是值,十六进制是显示方式
- 如果看不到,那么其显示方式是字符方式
- 若想让其显示出来,
select id,hex(online) from t3;
验证为何是ASCII码值:
- 首先改变列的属性:
alter table t3 modify online bit(10);
- 97换算成十六进制为61
浮点数类型
float,double,decimal
float
float[(m, d)] [unsigned]
: M指定显示长度,d指定小数位数,占用空间4个字节- 小数:没特殊说明,表示有符号的数,float(4,2)表示的范围是-99.99 ~ 99.99
mysql> create table if not exists t4(
-> id int,
-> salary float(4,2)
-> );
- MySQL在保存值时会进行四舍五入
注意:例如:-99.999四舍五入后为-100.000数据不允许插入
- 如果定义的是
float(4,2) unsigned
这时,因为把它指定为无符号的数,范围是 0 ~ 99.99
create table if not exists t5(id bigint, salary float(4,2) unsigned);
测试float:存在精度损失
float表示的精度大约是7位
alter table t5 modify salary float;
insert into t5 values (1,23456789.234526614);//ok
insert into t5 values (1,2349.234526);
insert into t5 values (1,23429.234526);
select * from t5;
decimal
decimal(m, d) [unsigned] : 定点数m指定长度,d表示小数点的位数
- decimal(5,2) 表示的范围是 -999.99 ~ 999.99
- decimal(5,2) unsigned 表示的范围 0 ~999.99
- float和decimal相似,但是表示的精度不一样
- decimal的精度更准确,因此如果我们希望某个数据表示高精度,选择decima
mysql> create table if not exists t6(
-> f1 float(10,8),
-> f2 decimal(10,8)
-> );
总结:
- float表示的精度大约是7位
- decimal整数最大位数m为65。支持小数最大位数d是30。如果d被省略,默认为0.如果m被省略,默认是10
- 建议:如果希望小数的精度高,推荐使用decimal
字符串类型
char
char(L): 固定长度字符串,L是可以存储的长度,**单位为字符**,最大长度值可以为255
- C语言中字符,一个字符对应一个字节。
- 与C中不同的是,MySQL中的字符,就代表一种符号,一个汉字就是一个字符
- char类型最大长度为:255
varchar
varchar(L): 可变长度字符串,L表示字符长度,最大长度65535个字节
mysql> create table t8(
-> id int,
-> name varchar(6)
-> );
区分字节与字符的不同
总结:
- varchar长度可以指定为0到65535字节之间的值,但是有1~3 个字节用于记录数据大小,所以说有效字节数是65532
- 与char的区别:
日期和时间类型
- 日期:年、月、日
- 时间:时、分、秒
常用的日期有如下三个:
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 if not exists t9(
-> t1 date,
-> t2 datetime,
-> t3 timestamp
-> );
注意:时间戳自动更新
如果插入数据,显示值为NULL,如下:
解决方法:设置时间戳的时候要设置当前时间
alter table t9 add column last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;
修改属性值:
update t9 set t1='1999_12_12';
更新数据,时间戳会更新成当前时间
枚举(enum)和集合(set)
enum
:提供了若干个选项的值,最终一个单元格中,实际只存储了其中一个值set
:提供了若干个选项的值,最终一个单元格中,设计可存储了其中任意多个值
mysql> create table votes(
-> username varchar(30),
-> gender enum('男','女'),
-> hobby set('登山','游泳','篮球','武术')
-> );
注意:
- 枚举可用数字代替,从1开始,且不能超过已有数量
- 同理,集合也可用数字代替,但是结果与枚举不同
- 输入0时可以插入,但是什么都不显示
- 输入其他的数要从二进制(比特位)的角度看
查找
- 在枚举里查找:
//1.
select * from votes where gender='男';
//2.
select * from votes where gender=1;
- 在集合里查找:
//筛选的是hobby只有篮球的,不能查询出所有,爱好中有篮球的人
select * from votes where hobby='篮球';
集合查询使用find_ in_ set函数
find_in_set(sub,str_list) :如果 sub 在 str_list 中,则返回下标;如果不在,返回0;str_list 用逗号分隔的字符串
//查询所有爱好篮球的人
select * from votes where find_in_set('篮球', hobby);
//查询即爱好篮球又爱好武术的人 ---- and
select * from votes where find_in_set('篮球', hobby)and find_in_set('武术', hobby);
mysql> select * from votes where find_in_set('篮球,武术', hobby);
Empty set (0.00 sec)