DDL:创建和管理表
DML:增删改查
DCL:1.TCL:commit和roll back 2.
数据类型:
数据类型的属性:
指定字符集
#创建数据库时指定字符集
select database() from dual;
create database if not exists test1 character set 'utf8';
show create database test1;
use test1;
#创建表时指定表的字符集
create table if not exists temp(
id int
)character set 'utf8';
show create table temp;
#创建表,指定表中字段时,可以指定字段的字符集
create table if not exists temp1(
name varchar(15) character set 'gbk'
);
show create table temp1;
整型类型
create table if not exists temp2(
f1 tinyint,
f2 smallint,
f3 mediumint,
f4 integer,
f5 bigint
);
select *from temp2;
insert into temp2(f1)
values(1),(-1),(-5);
当使用zerofill时,自动添加unsigned(无符号)标志
适用场景
浮点类型
float和double这两种数据类型的区别
float占用字节数少,取值范围小。
double占用字节数多,取值范围也大。
注意
所以浮点类型不用刻意去加unsigned标志,因为对大于0部分的数据范围无影响。
数据精度说明
create table if not exists t1(
f1 float,
f2 float(5,2),
f3 double,
f4 double(5,2)
);
insert into t1(f1,f2)
values(123.45,123.45);
存在四舍五入
四舍五入后超出范围
#报错
insert into t1(f1,f2)
values(123.45,999.995);
insert into t1(f1)
values(0.47),(0.44),(0.19);
select sum(f1)=1.1 #结果为0,说明0.47+0.44+0.19在该运算中不准确
from t1;
因为浮点数是不准确的,所以要避免使用‘=’来判断两个数是否相等。同时在一些对精确度要求较高的项目中,千万不要使用浮点数,不然会导致结果错误,甚至造成不可挽回的损失。
那么,MySQL有没有精准的数据类型呢?-------定点数类型:DECIMAL
定点数类型
浮点数vs定点数
1.浮点数相对于定点数的优点是在长度一定的情况下,浮点类型取值范围大,但不精准,适用于需要取值范围大,又可以容忍微小误差的科学计算场景(比如计算化学、分子建模、流体动力学等)
2.定点数类型取值范围相对小,但是精准无误差。适合对精度要求极高的场景(比如涉及金额计算的场景)
位类型:BIT
BIT类型中存储的是二进制值,类似010110
BIT类型,如果没有指定(M),默认是1位,表示只能存1位的二进制的位数,位数最小值为1,最大值为64。
比如bit(5)存储最大值二进制数为11111,转换为十进制为31。
若想要查看字段的二进制数或十六进制数,则可以用bin()和hex()。
和十进制数0相加后可以转换为十进制数。
日期与时间类型
year类型
year类型用来表示年份,在所有的日期时间类型中所占用的存储空间最小。只需要一个字节的存储空间。
注意
date类型
curdate(),current_date(),now()表示当时的年月日
time类型
‘2 12:30:29’中的2表示2天,224+12=60h
‘12:40’表示时和分
‘1 05’中05表示5h,所以124+5=29h
当1210没有加上单引号的时候,表示分和秒。
now(),current_time(),curtime()
datetime类型
timestamp类型
timestamp和datetime的区别
开发中datetime使用较多。
一般存注册时间、商品发布时间等,不建议使用datetime存储,而是使用时间戳,因为datetime虽然直观但不便于计算。
文本字符串类型
char与varchar类型
char和varchar类型都可以存储比较短的字符串。
注意:
当查询长度不满M的字符时,char类型的字段会自动除去尾部的空格,但当我们存储的数据尾部本身就含有空格时,char类型的字段也会将空格除去。
哪些情况使用char或varchar更好
text类型
ENUM类型
也叫枚举类型,ENUM类型的取值范围需要在定义字段时进行指定。设置字段值时,ENUM类型只允许从成员中选取单个值,不能一次选取多个值。
没有限制非空的情况下,也可以添加null值。
set类型
set表示一个字符串对象,可以包含0个或多个成员,但成员个数的上限为64.设置字段值时,可以取取值范围的0个或多个值。
当set类型包含的成员个数不同时,其所占用的存储空间也是不同的。
二进制字符串类型
MySQL中的二进制字符串类型主要存储一些二进制数据,比如可以存储图片、音频和视频等二进制数据。
MySQL中支持的二进制字符串类型主要包括binary、varbinary、tinyblob、blob、mediumblob和longblob类型。
binary和varbinary
binary和varbinary在实际开发中的应用场景较少,了解一下就行。
json类型
小结及建议
使用decimal时要指定d和m,比如decimal(5,2),否则默认是decimal(10,0),则会四舍五入舍去小数部分。