数据类型分类
分类 | 数据类型 | 说明 |
---|---|---|
数值类型 | 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成员值本身不能包含逗号。 |
数值类型
类型 | 字节 | 最小值(带符号的/无符号的) | 最大值(带符号的/无符号的) |
---|---|---|---|
TINYINT | 1 | -128 / 0 | 127 / 255 |
SMALLINT | 2 | -32768 / 0 | 32767 / 65535 |
MEDIUMINT | 3 | -8388608 / 0 | 8388607 / 16777215 |
INT | 4 | -2147483648 / 0 | 2147483647 / 4294967295 |
BIGINT | 8 | -9223372036854775808 / 0 | 9223372036854775807 / 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);