MySQL学习实验(三)数据类型

数据类型分类

分类数据类型说明
数值类型BIT(M)位类型。M指定位数,默认值1,范围1-64
数值类型TINYINT [UNSIGNED]带符号的范围-128~127,无符号范围0~255,默认有符号
数值类型BOOL使用0和1表示真和假
数值类型SMALLINT [UNSIGNED]带符号是-2^15次方到 2^15-1,无符号是2^16-1
数值类型INT [UNSIGNED]带符号是-2^31次方到 2^31-1,无符号是2^32-1
数值类型BIGINT [UNSIGNED]带符号是-2^63次方到2^63-1,无符号是2^64-1
数值类型FLOAT[(M,D)][UNSIGNED]M指定显示长度,d指定小数位数,占用4字节
数值类型DOUBLE[(M,D)][UNSIGNED]表示比float精度更大的小数,占用空间8字节
数值类型DECIMAL(M,D) [UNSIGNED]定点数M指定长度,D表示小数点的位数
文本、二进制类型CHAR(size)固定长度字符串,最大255
文本、二进制类型VARCHAR(SIZE)可变长度字符串,最大长度65535
文本、二进制类型BLOB二进制数据
文本、二进制类型TEXT大文本,不支持全文索引,不支持默认值
时间日期DATE/DATETIME/TIMESTAMP日期类型(yyyy-mm-dd)(yyyy-mm-dd hh:mm:ss) timestamp时间戳
String类型ENUM类型ENUM是一个字符串对象,其值来自表创建时在列规定中显示枚举的一列值
String类型SET类型SET是一个字符串对象,可以有零或多个值,其值来自表创建时规定的允许的一列值。指定包括多个set成员的set列值时各成员之间用逗号间隔开。这样set成员值本身不能包含逗号。

数值类型

类型字节最小值(带符号的/无符号的)最大值(带符号的/无符号的)
TINYINT1-128 / 0127 / 255
SMALLINT2-32768 / 032767 / 65535
MEDIUMINT3-8388608 / 08388607 / 16777215
INT4-2147483648 / 02147483647 / 4294967295
BIGINT8-9223372036854775808 / 09223372036854775807 / 18446744073709551615

整数类型 

tinyint类型 带符号 -128~127 无符号0~155(一个字节像c语言里面的char)

例1 tinyint

4是什么 

越界 

 在C/C++中

char a=0;

a=200; 

编译器怎么看待?告警-截断

但是在MySQL,可不会截断。

如果插入的数据不符合要求,MySQL直接终止操作,保证存储数据库的可信度,倒逼程序员必须遵守规则 --约束!约束谁?程序员!已经能插入的是符号条件的。

SQL 错误 [1264] [22001]: Data truncation: Out of range value for column 'num' at row 1

例2 tinyint unsigned

 尽量不使用unsigned,类型除了大小还有语义功能如年龄设置非负的无符号数。

bit类型

位字段类型,bit(M),有几个比特位,M省略默认1

如一种状态两种身份 登录或离线,vip或者其他(但是现在大公司不缺钱,并且用int可以表示更多状态)

例1

最多255 

 

有的bit类型按照ASCII码显示,这里按照二进制显示 。

例2

越界

float类型 [(M),(D)]长度,小数点位数,占用空间四个字节

例1 有符号float

 小数点位数超过

全局长度超过

 

如果精度4,2最后一个精度只会四舍不会五入直接去精度。

例2 无符号float

越界

如果5入会越界会不然5入

4舍不越界可以

decimal类型

decimal(5,2)表示的范围是-999.99~999.99

decimal(5,2)unsigned 0~999.99

例1

decimal比float精度更准确。

存储浮点数,注定会发生精度损失,转成整数小数部分乘2取整,无法取完。

取整方式

1.零向取整:正数负数小数点后面全部丢弃 

int a =10/3

a=3

2.向上取整:

3.四舍五入

字符串类型

char类型

char(L):固定长度字符串,L可以存储长度,单位字符,最大255。

mysql中的字符就是一个字符,可以是英文,可以是汉字。

是一个字符,不是字节,中文字符占多字节,在这里也只占一个位。

例1

插入

插入失败

插入空串,where可以得出区别。

查看结果

例2 char(L)最大255字符

varchar

varchar(L)可变长字符串,L表示字符长度,最大长度65535字节

例1

区别在哪里,到边界了也是不能插入。

一个字符串长度有上限,和他是变长的并不直接冲突。

例2

utf8 varchar(n)n最大值是65532/3=21844,因为utf8一个字符占三个字节,

gbk n最大为 65535/2(因为gbk最大一个字符占两个字节)

长度超过最大字符长度

varchar和char对比

+1字节,是记录前面字符长度 utf8

如何选择定长或变长字符串?

  • 如果数据确定长度都一样,就使用定长(char),比如:身份证,手机号,md5
  • 如果数据长度有变化,就使用变长(varchar),比如:名字,地址,但是你要保证最长的能存的进去
  • 定长的磁盘空间比较浪费,但是效率高。
  • 变长的磁盘空间比较节省,但是效率低。
  • 定长的意义是,直接开辟好对应的空间
  • 变长的意义是,在不超过自定义范围的情况下,用多少,开辟多少。

日期和时间类型

常用的日期有如下三个:

  • date:日期'yyyy-mm-dd',占用三字节
  • datetime 时间日期格式'yyyy-mm-dd HH:ii:ss'表示范围从 1000到9999 ,占用八字节
  • timestamp:时间戳,从1970年开始的 yyyy-mm-dd HH:ii:ss 格式和 datetime 完全一致,占用四字节

时间戳默认当前时间

如查历史订单,需要某件事情什么时候发生的 

enum和set

 例1

可以用数字的方式进行插入 

set 插入表示

set 1 2 3 4 5 ->位图形式存储

000什么爱好都没有

001代码

010 游泳

011代码游泳

100 登山

..

错误

查询

select * from votes where gender=1;

select * from votes where gender='女';

想查爱好有代码的
集合查询用 find_in_set函数

实验SQL

use bin_db;
create table t1(
	num tinyint
);

show tables;
desc t1;
insert into t1 values(127);
-- insert into t1 values(128);
select *from t1;
insert into t1 values(-128);
insert into t1 values(-1);
insert into t1 values(1);
insert into t1 values(-129);


create table t2 (num tinyint unsigned);
insert into t2 values(129);
insert into t2 values(256);
select * from t2;

create table t3(
	id int ,
	a bit(8)
);
show tables;
desc t3;
insert into t3 values(10,10);
insert into t3 values(10,255);
insert into t3 values(10,'a');

select * from t3;

create table t4(
	name varchar(32),
	gender bit(1)
);

insert into t4 values('马云',1);
insert into t4 values('董明珠',0);
insert into t4 values('董明珠2',5);

select *from  t4;
select * from t4 where gender=1;

create  table t5(
	id int,
	salary float(4,2)
);

desc t5;
insert  into t5 values(1,99.99);
select *from t5 ;
insert  into t5 values(1,-99.99);
insert  into t5 values(1,99.999);
insert  into t5 values(1,999.99);
insert  into t5 values(2,0.996);
insert  into t5 values(1,89.99);
insert  into t5 values(2,99.996);

delete from t5 where id =2;
desc t5;
alter table t5 modify salary float(4,2) unsigned;
desc t5;
insert into t5  values(1,99.99);
insert into t5  values(1,-99.99);
desc t5;
insert into t5  values(1,100.99);
insert into t5  values(1,0.99);
insert into t5  values(191,99.985);


create table t6(
	id int,
	salary float(10,8),
	salary2 decimal(10,8)
);

desc t6;

insert into t6 values (1,12.12345612,23.23456765);
select *from t6;

create table t7(
	id int,
	name char(2)
);

desc t7;

insert into t7 values (1,'ab');
insert into t7 values (1,'abc');
insert into t7 values (1,'');
insert into t7 values (1,'中国');
insert into t7 values (1,'中国人');
select * from t7;

create table t8 (
	id int,
	name char(256)
);

create table t9(
	id int,
	name varchar(6)
);
desc t9;

insert into t9 values(1,'');

insert into t9 values(1,'a');
insert into t9 values(1,'aqw123');
insert into t9 values(1,'qweqw11');


create table t10(
	name varchar(21844)
);

create table t11(
	name varchar(21845)
);


show tables;

create table t11(
	t1 date,
	t2 datetime,
	t3 timestamp
);

desc t11;

insert into t11 (t1,t2)values ('1998-7-1','2023-04-09 10:02:31');
insert into t11 (t1,t2)values ('1998-7-1','2023-04-09 10:02:45');
select * from t11;

create table if not exists votes(
	name varchar(48),
	gender enum('男','女'),
	hobby set('代码','游泳','登山')
)engine=InnoDB default charset=utf8; 

desc votes;

insert  into votes values ('张三','男','代码');
insert  into votes values ('张肥','男','代码,登山');
insert  into votes values ('花木兰','女','游泳,登山');
select * from votes;
insert  into votes values ('貂蝉',2,'游泳,登山');
insert  into votes values ('貂蝉11',2,2);
insert  into votes values ('貂蝉11',2,3);

select * from votes where hobby=3;
select * from votes where hobby='代码,游泳';

select 1+1;
select find_in_set('a','a,b,c');
select find_in_set('a','b,d,c');

select * from votes where  find_in_set('登山',hobby)AND find_in_set('游泳',hobby);





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值