MySql 数据类型

MySql有很多数据类型 今天我们来介绍一下其中比较特殊的几种

1.整型

整型类型有很多 我们这里以tinyint为例

我们发现MySql和C++不一样 MySql里面的值插入的时候超出范围是无法插入成功的

要严格满足它的数据范围

2.浮点型

存储大小:4 字节 精度范围:约 7 位有效数字 语法格式:float(M, D),

其中:

M 表示总位数(整数部分 + 小数部分)

D 表示小数部分的位数 取值范围:-3.402823466E+38 到 -1.175494351E-38,0,1.175494351E-38 到 3.402823466E+38

MySql的浮点型有float double 和decimal 我们今天重点介绍float和decimal

我们来看后面两个插入为什么会失败

本质上我们插入231.2的时候 小数不足两位会默认补足两位 也就是 231.20这样总位数就是5位就超过了4位

因此不在范围内

我们再来看下面这个插入

这个地方我们插入float(decimal)的1.2666 小数位和总位数都超了 但是这个地方小数只取两位(四舍五入的取法)加上整数位 总位数就没有超过了

而decimal是直接截断

总结:float(M, D),

D表示不管小数点后的是几位 最后都会被 截断(四舍五入)补位变成两位

M表示整数位数+D不能超过M位

我们再来看看decimal和float的区别

我们发现这里明明插入的数明明是合法的

但是float却出现了精度缺失

而decimal却依然准确

因此我们可以总结float和decimal的区别了

3.bit类型

bit[(M)] : 位字段类型。M表示每个值的位数,范围从1到64。如果M被忽略,默认为1。
--存储空间:根据 M 动态分配,每 8 位占用 1 字节
--(例如 bit(1) 占 1 字节,bit(9) 占 2 字节)
--取值范围:0 到 2^(M-1)(无符号,仅支持非负整数)

bit类型存的是二进制位 除了存数字以外

我们也可以用来存字符 但是存进去的是对应的ASCII 编码

4.字符串类型

字符串类型有char和varchar

char 类型:固定长度的字符串

char 是固定长度字符类型,其特点是无论实际存储的字符串长度如何,都会占用固定大小的存储空间。

基本特性

语法格式:char(M),其中 M 表示最大字符数,范围为 0-255

存储方式:无论实际字符串长度,均占用 M 个字符的存储空间

填充机制:存储时如果字符串长度小于 M,会在右侧用空格填充至长度 M;读取时会自动去除尾部空格

编码影响:M 表示字符数而非字节数,在不同字符集下(如 utf8mb4),实际占用字节可能更多

varchar

varchar 类型:可变长度的字符串

varchar 是可变长度字符类型,其存储空间会根据实际存储的字符串长度动态调整,能更高效地利用存储空间。

基本特性

语法格式:varchar(M),其中 M 表示最大字节数(InnoDB 引擎下最大为 65535字节)

存储方式:实际占用空间 = 字符串字节数 + 1到3 字节的长度前缀(用于记录字符串实际长度)

关于varchar(len),len到底是多大,这个len值,和表的编码密切相关:
varchar长度可以指定为065535之间的值,但是有1 - 3 个字节用于记录数据大小,所以说有效字
节数是65532
当我们的表的编码是utf8时,varchar(n)的参数n最大值是65532/3=21844[因为utf中,一个字符占
3个字节]
如果编码是gbkvarchar(n)的参数n最大是65532/2=32766(因为gbk中,一个字符
占用2字节)。
我们可以用代码验证一下

5.日期和时间类型

日期和时间类型有如下三个 date datetime timestamp

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

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

timestamp和datetime的区别

7.枚举和集合

枚举 enum可以理解成单选  一次插入只能插入其中的一个

而集合 set 可以理解成多选 一次插入可以插入其中任意个

那我们插入的2,7是什么意思呢?

enmu对应的2是下标 MySql的下标和数组的不一样 MySql的下标是从1开始的 所以2对应的就是female

而set对应的7不能单纯看作下标 我们要先将其转换成二进制0111 

我们看到2的0次方 2的一次方 2的2次方 位上是1

所以我们这个地方下表是从0开始算的 也就是下标0 1 2存在

也就是C++ JAVA PYTHON正好对上了

那我们再看看set插入0会怎么样

我们发现我们插入0这个地方是空着的

但是这个地方和NULL不一样

NULL是没有数据

而这里是有数据 数据是set这么多选项 一个不选

set是在所有选项里面选任意个 当然也可以是0个啦

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值