2024年C C++最全【MySQL必知必会】字段(3),阿里开发7年大牛

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

insert into demo.goodsmaster
(barcode,goodsname,price)values (‘0003’, ‘胶水’, 0.19);

SELECT SUM(price)
FROM demo.goodsmaster;

– SELECT * FROM demo.goodsmaster 不能这样写 因为商品名可能会重复
– WHERE SUM(price) = 1.1;

– SELECT goodsname,SUM(price)
– FROM demo.goodsmaster
– GROUP BY goodsname
– HAVING SUM(price)=1.1;


其中 `price`  就是浮点数类型 得到结果是  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/eb01f6268dc741c7a7a7f9fb4e78c89b.png)  
 问题还是出在 MySQL 对浮点类型数据的存储方式上。  
 MySQL 用 4 个字节存储 FLOAT 类型数据,用 8 个字节来存储 DOUBLE 类型数据。无论哪个,都是采用二进制的方式来进行存储的。比如 9.625,用二进制来表达,就是 1001.101。如果尾数不是 0 或 5,就无法用一个二进制数来精确表达就只好在取值允许的范围内进行近似(四舍五入)。数据类型是 DOUBLE 的时候,我们得到的结果误差更小一些, 而数据类型是 FLOAT 的时候,误差会更大一下。原因就是,DOUBLE 有 8 位字节,精度更高。


**优化 : 定点数类型:DECIMAL。**  
 `DECIMAL(M,D)`的方式表示高精度小数。M 表示整数部分加小数部分,一共有多少位,M<=65。D 表示小数部分位数,D<M  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/9c3c597b6ae84b4a8b48a57842882d2f.png)



ALTER TABLE demo.goodsmaster
MODIFY COLUMN price DECIMAL(5, 2);

SELECT SUM(price)
FROM demo.goodsmaster;


总结:  
 浮点类型取值范围大,但是不精准,适用于需要取值范围大,又可以容忍微小误差的科学计算场景(比如计算化学、分子建模、流体动力学 等);定点数类型取值范围相对小,但是精准,没有误差,适合于对精度要求极高的场景 (比如涉及金额计算的场景)。


## 文本类型


* CHAR(M):固定长度字符串。CHAR(M) 类型必须预先定义字符串长度。如果太短,数 据可能会超出范围;如果太长,又浪费存储空间。
* VARCHAR(M): 可变长度字符串。VARCHAR(M) 也需要预先知道字符串的最大长度, 不过只要不超过这个最大长度,具体存储的时候,是按照实际字符串长度存储的。
* TEXT:字符串。系统自动按照实际长度存储,不需要预先定义长度。
* ENUM: 枚举类型,取值必须是预先设定的一组字符串值范围之内的一个,必须要知道 字符串所有可能的取值。
* SET:是一个字符串对象,取值必须是在预先设定的字符串值范围之内的 0 个或多个, 也必须知道字符串所有可能的取值。


**对于 ENUM 类型和 SET 类型来说 一般用于 参数设定的取值范围只有几个固定值的场景 , 其中 TEXT 类 型最为灵活方便**。  
 TEXT 类型也有 4 种,它们的区别就是最大长度不同。


* TINYTEXT:255 字符(这里假设字符是 ASCII 码,一个字符占用一个字节,下同)。
* TEXT: 65535 字符。
* MEDIUMTEXT:167 77215 字符。
* LONGTEXT: 4294967295 字符(相当于 4GB)。  
 **由于实际存储的长度不确定,MySQL 不允许 TEXT 类型的字段做主键。遇到这种情况,你只能采用 CHAR(M),或者 VARCHAR(M),非主段的就可以按照数据可能的最大长度, 选择这几种 TEXT 类型中的的一种,作为存储字符串的数据类型**。


## 日期与时间类型


**实际项目中尽量使用 DATETIME ( 因为这个数据类型使用起来比较方便为了确保数据的完整性和系统的稳定性,优先考虑使用 DATETIME 类型)**  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/78c7f53732624b9eb707eb5932c68d95.png)  
 TIME 类型,不光表示一天之内的时间,而且可以用来表示一 个时间间隔,这个时间间隔可以超过 24 小时。 所以不是-23:59:59~23:59:59


## 总结


* 1.整数类型  
 TINYINT多用于布尔类型 枚举类型  
 占1个字节  
 一般来讲INT用的最多  
 占4个字节  
 除非该数字有可能超过21亿 一般不用BIGINT  
 不要为了节省一点存储空间 而忽视数据溢出带来的风险 可靠性第一!
* 2.浮点数类型和定点数类型  
 浮点数  
 float 单精度浮点数  
 double 双精度浮点数 mysql默认使用  
 缺陷:浮点数不精准  
 二进制无法精确表达 所以只能四舍五入  
 定点数  
 decimal可以精确表达  
 把十进制的整数与小数拆分 用十六进制存储  
 decimal(5,2)  
 前面的5是长度 后面的2是保留几位小数  
 涉及小数 可以无脑用decimal  
 ps:涉及金额的 也可以以分为单位 用整型来存储
* 3.文本类型  
 一般都可无脑用text 65535字符 如果过长 则使用longtext  
 text类型无需提前定义长度 且按实际长度存储  
 varchar(M)需要定义长度 但也是按实际长度存储的  
 注意 这里的M指的是字符 所以不管是英文还是中文 都可容纳M个  
 但text类型不能作为主键  
 这时候可以选择varchar或char
* 4.日期与时间类型  
 尽量使用datetime类型 用的最多 最完整
* 5.总结  
 整数用`int` 小数用`decimal` 字符串用`text/varchar` 时间用`datetime`


导图复制的 可能排版不太好


俩个重要语句:



– 修改字段类型语句
ALTER TABLE demo.goodsmaster
MODIFY COLUMN price DECIMAL(5, 2); – 计算字段合计函数:
SELECT SUM(price)
FROM demo.goodsmaster;


**在定义数据类型时,如果确定是整数,就用 INT; 如果是小数,一定用定点数类型 DECIMAL;如果是字符串,只要不是主键,就用 TEXT; 如果是日期与时间,就用 DATETIME**


* 整数:INT。
* 小数:DECIMAL。
* 字符串:TEXT。
* 日期与时间:DATETIME。




![img](https://img-blog.csdnimg.cn/img_convert/c2bbd688aea60b45d4d06c8ba2283dcf.png)
![img](https://img-blog.csdnimg.cn/img_convert/7a1d25842402a41b842f482c1bd66bb1.png)

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以添加戳这里获取](https://bbs.csdn.net/topics/618668825)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

戳这里获取](https://bbs.csdn.net/topics/618668825)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值