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 字节的长度前缀(用于记录字符串实际长度)



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个啦
1437

被折叠的 条评论
为什么被折叠?



