3.MySQL数据类型详解

个人主页:Lei宝啊

愿所有美好如期而遇


1.数据类型分类

数值类型:bit

tinyint smalliint int bigint

float double decimal

bool

文本,二进制类型:

char

varchar

text

时间日期:date datetime timestamp

String类型:

enum

set

2.数值类型

(1).tinyint,smallint类型等

事实证明,mysql不允许不合法的数据插入,-129和128超出了tinyint的范围。

接下来我们测试一下无符号tinyint的范围。

显然,变成了0~255.

(2)bit类型

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

我们发现竟然什么都没有,为什么呢?

bit字段在显示时,是按照ASCII码对应的值显示

先将num的范围改大点

(3)小数类型

1).float

float(m, d) unsigned : M指定显示长度,d指定小数位数,占用空间4个字节

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

我们先不指定宽度和小数位数。

可以看出默认6位小数,再多就会丢失精度。

接下来指定一下宽度和精度。

99.9954进位后就是100.00,超出宽度,数据不合法,数据库不允许插入,精度一定会保持两位,哪怕是补两个0.

这样也可以。

接下来看一下无符号float

于是我们知道了,float(4,2) unsigned 类型的数据范围只有0~99.99

2).decimal

decimal(m, d) unsigned : 定点数m指定长度,d表示小数点的位数

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

默认是10。

建议:如果希望小数的精度高,推荐使用decimal。

decimal的精度很高,基本上插入几就是几,float丢失精度就比较多了。

3.字符串类型

(1)char

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

注意:utf8中一个字符占3个字节,而gbk中一个字符占2个字节

这里的一个字符可以是数字,字母,符号和汉字,都是一个字符。

(2)varchar

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

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

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

节数是65532。

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

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

占用2字节)。

(3)char和varchar比较

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

如果数据确定长度都一样,就使用定长(char),比如:身份证,手机号,md5

如果数据长度有变化,就使用变长(varchar), 比如:名字,地址,但是你要保证最长的能存的进去。

定长的磁盘空间比较浪费,但是效率高。

变长的磁盘空间比较节省,但是效率低。

定长的意义是,直接开辟好对应的空间

变长的意义是,在不超过自定义范围的情况下,用多少,开辟多少。

(4)日期和时间类型

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

先插入一个date类型的数据。

emmm?我们没插入datastamp类型的数据啊,为什么呢?这是因为他有default值,也就是默认值,当我们不插入时,默认插入现在的时间。而且就算你刻意插入NULL,插不进去,因为他不允许为空。

而且时间戳会自动更新当前时间。

(5)enum和set

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

不可插入多个选项。

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

再插入几个数据。

将set里的选项当做比特位,a就是1,a,b就是11,a,b,c就是111,转换为十进制就是1,3,7

再来看一个。

这样也是可以的。

但是我们也想找包含'a'的所有项,怎么找?

集合查询使用find_ in_ set函数:
find_in_set(sub,str_list) :如果 sub 在 str_list 中,则返回下标;如果不在,返回0

首先select可以执行表达式和函数。

非0为true,而且我们看到这个函数只能查找单个字符。

这样我们就筛选出了所有爱好为a的人。

那么如何筛选爱好为a,b的人呢?

用and连接就好了。

综合举个栗子

先建个新表。

不可以这样查找。

这样查可以,但是不能够包含。

相关推荐
小蒜学长3 分钟前
基于SpringBoot + Vue的智能健身房管理系统的设计与实现(代码+数据库+LW)
java·数据库·vue.js·spring boot·后端
芦柑46412 分钟前
画布和3D导演台工具:短剧分镜从素材整理到空间预演的完整链路
服务器·前端·数据库
南城以南溫暖如初14714 分钟前
AI 智能商城 APP 定制开发的核心需求
java·人工智能·spring boot·mysql·mybatis·需求分析
专注仿真23 分钟前
TRAE Work 的实战
数据库·人工智能·分析
ACP广源盛1392462567336 分钟前
端侧 AI 硬件架构实践@ACP#中端边缘整机 PCIe 扩展与 IX7012 器件分析
大数据·数据库·人工智能·嵌入式硬件·开源·硬件架构
ACP广源盛1392462567337 分钟前
端侧 AI 硬件架构探讨@ACP#多外设高密度整机 PCIe 扩展与 IX7024 器件分析
大数据·数据库·人工智能·嵌入式硬件·开源·硬件架构
数智启示录1 小时前
Doris精讲篇(六) 从第一批小文件到 -235:Doris 是怎样被正常写入拖死的
大数据·数据库·经验分享·面试·flink
智购科技自动售货机工厂1 小时前
2026自动售货机异常重启根因分析:从日志挖掘到内存取证的技术实践~YH
开发语言·数据库·单片机·嵌入式硬件·人机交互
奈斯先生Vector1 小时前
从“能调用”到“可运营”:AI Agent 进入多模型时代后的架构升级
java·javascript·数据库·人工智能·算法·架构·aigc
whcyhhh1 小时前
头歌实践教学平台:大数据存储2023(十四下答案)
大数据·数据库·python