MySQL——数据类型

目录

一.数据类型分类

[二. 数值类型](#二. 数值类型)

1.tinyint类型

2.bit类型

3.float类型

4.decimal

三.字符串类型

1.char

2.varchar

四.日期和时间类型

五.enum和set


一.数据类型分类

关于数据库的数据类型有非常多,但是并非所有的数据类型都是我们常用的,今天我们列举常用的数据类型。

二. 数值类型

1.tinyint类型

tinyint数值范围在 -128 ~ 127 之间。

tinyint unsigned无符号数输在范围在 0 ~ 255;

测试tinyint:

插入-129失败,插入128失败。

测试tinyint unsiged

在第二列插入-1和256失败。

2.bit类型

基本语法:

sql 复制代码
bit (M) : 位字段类型。M表示每个值的位数,范围从1到64。如果M被忽略,默认为1。

测试:

bit使用的注意事项:

  1. bit字段在显示时,是按照ASCII码对应的值显示,所以刚刚我们插入98显示的是b。
  2. 如果我们有这样的值,只存放0或1,这时可以定义bit(1)。这样可以节省空间。

3.float类型

语法:

sql 复制代码
float[(m, d)] [unsigned] : M指定显示长度,d指定小数位数,占用空间4个字节

案例:

小数:float(4,2)表示的范围是-99.99 ~ 99.99,MySQL在保存值时会进行四舍五入,

注意:如果我们插入的值精度上超过了小数点两位四舍五入之后的值如果超出了整数部分范围,还是会被拒绝。

插入 99.99 成功,99.994成功,99.995失败。

如果定义的是float(4,2) unsigned 这时,因为把它指定为无符号的数,范围是 0 ~ 99.99。

案例:

4.decimal

语法:

sql 复制代码
decimal(m, d) [unsigned] : 定点数m指定长度,d表示小数点的位数
  • decimal(5,2) 表示的范围是 -999.99 ~ 999.99
  • decimal(5,2) unsigned 表示的范围 0 ~ 999.99

decimal和float很像,但是有区别:

float和decimal表示的精度不一样

decimal整数最大位数m为65。支持小数最大位数d是30。如果d被省略,默认为0.如果m被省略,

默认是10。

三.字符串类型

1.char

语法:

sql 复制代码
char(L): 固定长度字符串,L是可以存储的长度,单位为字符,最大长度值可以为255

注意:L的单位是字符,而非字节。

char(3) 表示可以存放三个字符,可以是字母或汉字,但是不能超过3个, 最多只能是255。

2.varchar

语法:

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

案例:

sql 复制代码
create table t8(id int ,name varchar(6));

关于varchar(len),len到底是多大,这个len值,和表的编码密切相关:

varchar长度可以指定为0到65535之间的值,但是有1 - 3 个字节用于记录数据大小,所以说有效字

节数是65532。

当我们的表的编码是utf8时,varchar(n)的参数n最大值是65532/3=21844 [因为utf8中,一个字符占

用3个字节],如果编码是gbk,varchar(n)的参数n最大是65532/2=32766(因为gbk中,一个字符

占用2字节)。

注意:上述说的65535是包括 1 - 3 个字节用于记录长度,并且这65535是一整行共用的。

char和varchar比较:

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

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

四.日期和时间类型

常用的日期有如下三个:

date :日期 'yyyy-mm-dd' ,占用三字节

datetime 时间日期格式 'yyyy-mm-dd HH:ii:ss' 表示范围从 1000 到 9999 ,占用八字节

timestamp :时间戳,从1970年开始的 yyyy-mm-dd HH:ii:ss 格式和 datetime 完全一致,占用

四字节

更新数据:

sql 复制代码
mysql> update birthday set t1='2000-1-1';

时间戳就会跟着改变。

五.enum和set

  1. enum:枚举,"单选"类型;
  2. enum('选项1','选项2','选项3',...);

该设定只是提供了若干个选项的值,最终一个单元格中,实际只存储了其中一个值;而且出于效率考虑,这些值实际存储的是"数字",因为这些选项的每个选项值依次对应如下数字:1,2,3,....最多65535个;当我们添加枚举值时,也可以添加对应的数字编号。

  1. set:集合,"多选"类型;
  2. set('选项值1','选项值2','选项值3', ...);

该设定只是提供了若干个选项的值,最终一个单元格中,设计可存储了其中任意多个值;而且出于效率考虑,这些值实际存储的是"数字",因为这些选项的每个选项值依次对应如下数字:1,2,4,8,16,32,....最多64个。

说明:不建议在添加枚举值,集合值的时候采用数字的方式,因为不利于阅读。

案例:

对即合类型进行插入时,可以采用插入数字的方式,按照数字的比特位0或1,来决定对应位置上的集合元素是否插入。

find_in_set函数:

我们可以使用where进行判断某一个条件:

sql 复制代码
select * from person where level=2;

在person表中筛选出level等于2的数据。

如果我们向筛选出hobby中有rap的数据:

我们发现不太对劲,为什么想要的是hobby中包含rap的,不是只有rap的。

所以我们就要使用一个函数find_in_set:

find_in_set本身就可以用来查找集合,并返回结果再(1)或者不在(0);

相关推荐
杨江18 分钟前
ThingsBoard安装测试
服务器·数据库
mit6.82427 分钟前
[Redis#4] string | 常用命令 | + mysql use:cache | session
数据库·redis·后端·缓存
Beekeeper&&P...1 小时前
map和redis关系
数据库·redis·缓存
jianqimingtian1 小时前
如何使用 Matlab 制作 GrabCAD 体素打印切片
数据结构·数据库
真真假假々2 小时前
MySQL和ADSDB
数据库·mysql
秦老师Q2 小时前
MySQL第二章 sql约束与sql数据类型
数据库·sql·mysql
不是二师兄的八戒2 小时前
mysql in查询大数据量业务无法避免情境下优化
数据库·mysql
苹果醋32 小时前
vue3 在哪些方便做了性能提升?
java·运维·spring boot·mysql·nginx
----云烟----2 小时前
Qt获取文件夹下的文件个数(过滤和不过滤的区别)
数据库·qt
Dotrust东信创智2 小时前
浅谈丨功能安全测试,汽车的守护者
运维·服务器·数据库