MYSQL--数据类型

1、字符集

有时候,数据库需要用到不同的字符集来处理数据,这就要用到字符集设置
set names 字符集;
如 set names gbk;

深层原理:客户端,服务端,连接层

客户端传入数据给服务端:client:character_set_client
服务端返回数据给客户端:server:character_set_results
客户端与服务端之间的连接:connection:character_set_connection

查看几个层次之间的字符集
show variables like ‘character_set_%’;
在这里插入图片描述
或者修改单个层次的字符集:set 变量名 = 值;
如set character_set_client = gbk;
在这里插入图片描述
重新插入数据可以,但是查看的话就会出错,因为3个层级之间的字符集不一样
在这里插入图片描述
Set names gbk; //等价于
Set character_set_client = gbk; //为了让服务器识别客户端传来的数据
Set character_set_connection = gbk;//更好的帮助客户端与服务端之间进行字符集转换
Set character_set_results = gbk;//为了告诉客户端服务端所有的返回的数据字符集

2、列类型(字段类型)

2.1、整数类型
  • tinyint 迷你整型,1个字节=8位,-128~127
  • small 小整型,2个字节,-32768~32767
  • mediumint 中整型 ,3个字节,-83388608~83388607
  • int 标准整型,4个字节,
  • bigint 大整型,8个字节
2.2、无符号标识设定

无符号:没有符号,没有负数,只有整数,如tinyint范围变成了0-255
使用方法:在类型之后加上一个unsigned

create table my_int(
int_1 tinyint unsigned ) ; --用了无符号标识

insert into my_int values(100);--正确

insert into my_int values(-25);--错误

在这里插入图片描述
在这里插入图片描述

2.3、显示长度(失败,自己操作和书本的不一样)

显示长度:指数据(整型)在数据显示的时候,到底可以显示多长位。
例如:
tinyint(3): 表示最长可以显示3位,unsigned说明只能是正数,0-255永远不会超过三个长度,例如001
tinyint(4):表示最长可以显示4位,-128~127,例如-026

使用了zerofill后默认使用unsigned

alter  table my_int add int_2 tinyint zerofill ;
--增加一列

3、小数型

3.1、浮点型

浮点型又称之为精度类型:是一种有可能丢失精度的数据类型,数据有可能不那么准确(由其是在超出范围的时候)

  • float : 单精确型,4个字节来提供,大概是10^38,只能保证7个精度,大于7个数据会丢失
  • double:双精度型,8个字节,10^308,但是准确度也只有15位
使用方法(float来举例):

float表示不指定小数点的浮点数
float(M,D):表示一共存储M个有效数字,其中小数点占D位

--创建一个float和一个float(10,2)类型的表
create table my_float (
f1 float,
f2 float(10,2));

--插入3位小数点
insert into my_float values(123.123,456.789);

--	第二个插入10个有效数字
insert into my_float values(123.123,12345678.90);

--该数据插入失败,第二个超过了范围
insert into my_float values(123.123,123456789.99);

--
insert into my_float values(123.123,12345678.99);

--插入满的10位有效数字
insert into my_float values(123.123,99999999.99);

在这里插入图片描述
注意:如果数据精度丢失,那么浮点型是按照四舍五入的方式进行计算
浮点数的应用:通常是用来保存一些数量特别大,大到可以不用那么精确的数据。

3.2、定点数

decimal :系统会自动根据存储的数据来分配空间,每9个数分配4个字节。

用法:
decimal(M,D) :M表示有效数字,最大值不能超过65,D代表小数部分,最大值不能超过30

--创建定点数类型数据
create table my_decimal (
f1 float(10,2),
d1 decimal(10,2)
);

--插入同样的数据,但保存的东西不一样
insert into my_decimal values(99999999.99,99999999.99);

在这里插入图片描述

4、时间日期类型

  • date
    日期类型:系统使用三个字节来存储数据,对应的格式为:YYYY-mm-dd,能表示的范围是从1000-01-01 到9999-12-12,初始值为0000-00-00
  • time
    时间类型:能够表示某个指定的时间,但是系统同样是提供3个字节来存储,对应的格式为:HH:ii:ss,但是mysql中的time类型能够表示时间范围要大的多,能表示从-838:59:59~838:59:59,在mysql中具体的用处是用来描述时间段。
  • datetime
    日期时间类型:就是将前面的date和time合并起来,表示的时间,使用8个字节存储数据,格式为YYYY-mm-dd HH:ii:ss,能表示的区间1000-01-01 00:00:00 到9999-12-12 23:59:59,其可以为0值:0000-00-00 00:00:00
  • timestamp
    时间戳类型:mysql中的时间戳只是表示从格林威治时间开始,但是其格式依然是:YYYY-mm-dd HH:ii:ss
  • year
    年类型:占用一个字节来保存,能表示1900~2155年,但是year有两种数据插入方式:0 ~ 99和四位数的具体年
--创建时间数据表
create table my_date (
Ddate date,
Dtime time,
Ddatetime datetime,
Dtimestamp timestamp,
Dyear year
);

--插入数据
insert into my_date values(
'2020-04-16',
'12:12:12',
'2020-04-16 00:00:00',
'2020-04-16 00:00:00',
2077
);

在这里插入图片描述

  • time的特殊性:
    其可以存储一个很大的数,超过24
    在进行时间类型录入的时候(time)还可以使用一个简单的日期代替时间,在时间格式之前加一个空格,然后指定一个数字(可以是负数):系统会自动将该数字转换成天数 * 24小时,再加上后面的时间。
    例如上面的’12:12:12’,改成’5 12:12:12’,结果就会为:132:12:12,因为5 * 24+12=132

  • PHP中有着非常强大的时间日期转换函数:date将时间戳转换成想要的格式,strtotime又可以将很多格式转换成对应的时间戳。PHP通常不需要数据库来帮助处理这么复杂的时间日期,所以通常配合PHP的时候,时间的保存通常使用时间戳(真正),从而用整型来保存。字符串型

5、字符串类型

5.1、char

char(L),L为字符数,0<L<=255

5.2、varchar

varchar(L),L为字符数,0<L<=65535
其中,varchar会根据字符串的长度去自动分配合适的长度,每个varchar后面都会产生1-2个字节开销,用来保存长度。

5.3、text
  • Tinytext:系统使用一个字节来保存,实际能够存储的数据为:2 ^ 8 + 1
  • Text:使用两个字节保存,实际存储为:2 ^ 16 + 2
  • Mediumtext:使用三个字节保存,实际存储为:2 ^ 24 + 3
  • Longtext:使用四个字节保存,实际存储为:2 ^ 32 + 4

ps:如果没有选择哪个text类型的话,选择text,系统会根据长度自动去选择哪个text类型的

5.4、enum 枚举

枚举类型,先预设几个类型,该数据的类型只能从这几种预设类型中选择一个,相当于单选框

  • 使用方法:enum(‘数据值1’,‘数据值2’,……)
create table my_enum (sex enum('man','woman'));
insert into my_enum values('man');
insert into my_enum values('woman');

--插入错误的类型
insert into my_enum values('other');--这行会报错

在这里插入图片描述
在这里插入图片描述

枚举enum的存储原理!!!
  • 实际上字段上所存储的值并不是真正的字符串,而是字符串对应的下标:当系统设定枚举类型的时候,会给枚举中每个元素定义一个下标,这个下标规则从1开始
    enum(1=>‘man’,2=>’woman’);
insert into my_enum values (2);

在这里插入图片描述

  • 也可以这样查看
select sex + 0 from my_enum;

在这里插入图片描述

5.5、set

是一个将多种数据选项同时保存的类型,选中的为1,没选中的为0,和enum一样都是存储数字而不是存储字符串,但是存储的时候会把二进制颠倒过来存储
set(‘数据值1’,‘数据值2’,‘数据值3’,……)

create table my_set(
hobby set('唱','跳','rap','篮球')
)charset utf8;

insert into my_set values('唱');
-- 							1000

insert into my_set values('唱,跳,rap');
--							1110

--虽然是这样,但是存储的时候会把二进制颠倒过来

insert into my_set values(hobby+0);
insert into my_set values(15);

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值