SQL中常见的数据类型
目录
- 概述
- 一、整型
- 分类
- 特点
- 二、小数
- 分类
- 特点
- 三、字符型
- 四、日期型
- 分类
- 特点
概述
- 数值型
整数:整型
小数:定点数、浮点数 - 字符型
较短的文本:char、varchar
较长的文本:text、blob(用于保存较长的二进制数据,例如图片) - 日期型
一、整型
分类
tinyint(1个字节)、smallint(2个字节)、mediumint(3个字节)、int/integer(4个字节)、bigint(8个字节)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aLSdR2si-1676519414338)(DataType%int.PNG)]
注:它们的区别仅仅在于可保存的数值范围
特点
- 如果不设置无符号还是有符号,默认是有符号,如果想设置无符号,需要添加关键字unsigned
- 如果插入的数值超出了范围,会报Out of range异常,并且插入的值是该数值型存储范围的临界值
- 如果不设置长度,会有默认的长度
- 长度代表了显示的最大宽度,如果数值本身不够的话会用0在左边填充,但必须搭配关键字zerofill来使用
- 如何设置有符号和无符号
drop table if exists tab_int;
create table tab_int(t1 int,t2 int unsigned);#有符号
desc tab_int;
insert into tab_int values(-8,-8);
select * from tab_int;#显示-8 0
- Out of range问题
insert into tab_int values(2147483648,4294967296);
select * from tab_int;
- 设置长度
注:加了关键字zerofill,左边填补的0才会显示出来,并且如果使用了zerofill,则必须是无符号整数(不然报错)
drop table if exists tab_int;
create table tab_int(t1 int,t2 int unsigned,t3 int(7),t4 int(7) zerofill);
select * from tab_int;
insert into tab_int values(-8,123456,12,12);
二、小数
分类
- 浮点型
float(M,D)
double(M,D) - 定点型
dec(M,D)
decimal(M,D)
特点
- M:整数位数+小数位数
D:小数位数
如果超过范围,则插入临界值 - M和D都可以省略
如果是decimal,则默认M为10,D为0
如果是float和double,则会根据插入的数值的精度来决定精度 - 定点型的精度较高,如果要求插入数值的精度较高如货币运算等则可以考虑使用,否则一般考虑使用float
- 原则:
所选择的类型越简单越好,能保存的数值的类型越小越好
测试特点
(1)M与D的含义
create table tab_float(f1 float(5,2),f2 double(5,2),f3 decimal(5,2));
desc tab_float;
select * from tab_float;
insert into tab_float values(123.43,123.43,123.43);
insert into tab_float values(223.432,223.432,223.432);
insert into tab_float values(323.4,323.4,323.4);
insert into tab_float values(4323.4,4323.4,4323.4);#整数位超出了3
(2)省略M与D
drop table if exists tab_float;
create table tab_float(f1 float,f2 double,f3 decimal);
desc tab_float;
三、字符型
确切地,应该称为串数据(包含文本型和二进制)
较短的文本(重点介绍):
- char 与varchar
特点:
写法 | M的意思 | 特点 | 空间的耗费 | 效率 | |
char | char(M) | 最大的字符数,可以省略,默认为1 | 固定长度的字符 | 比较耗费 | 稍高 |
varchar | varchar(M) | 最大的字符数,不能省略 | 可变长度的字符 | 比较节省 | 稍低 |
例:如果要存储性别字段,建议使用char,如果是家庭住址字段,建议使用varchar。
- binary和varbinary类型
类似于char和varchar可以用于保存较短的二进制字符串 - enum枚举类型
- set集合类型
较长的文本:
text、blob
案例:枚举类型的设置
create table tab_char(c1 enum('a','b','c'));
desc tab_char;
insert into tab_char values('a');
insert into tab_char values('b');
insert into tab_char values('c');
insert into tab_char values('d');#报错,插入失败
insert into tab_char values('A');#不区分大小写
select * from tab_char;
create table tab_set(s1 set('a','b','c','d'));
insert into tab_set values('a');
insert into tab_set values('a,b,c');
insert into tab_set values('A,B,B');
insert into tab_set values('a,b,c,d');
drop table if exists tab_set;
select * from tab_set;
四、日期型
分类
date 只保存日期
time 只保存时间
year 只保存年
datetime 保存日期+时间
timetamp 保存日期+时间
特点
字节 | 范围 | 时区等的影响 | |
datetime | 8 | 1000-9999 | 不受 |
timestamp | 4 | 1970-2038 | 受 |
timestamp比较容易受时区、语法模式和版本的影响,更能反映当前时区的真实时间
案例:关于datetime与timestamp
create table tab_datetime(d1 datetime,d2 timestamp);
insert into tab_datetime values(now(),now());
set time_zone='system';
show variables like 'time_zone';
set time_zone='+9:00';#修改一下时区,将东八区修改为东九区
select * from tab_datetime;