mysql 关于数字类型的几个坑
01—浮点类型和高精度类型
MySQL 之前的版本中存在浮点类型 Float 和 Double,但这些类型因为不是高精度,也不是 SQL 标准的类型,所以在真实的生产环境中不推荐使用,否则在计算时,由于精度类型问题,会导致最终的计算结果出错。
更重要的是,从 MySQL 8.0.17 版本开始,当创建表用到类型 Float 或 Double 时,会抛出下面的警告:MySQL 提醒用户不该用上述浮点类型,甚至提醒将在之后版本中废弃浮点类型。
Specifying number of digits for floating point data
types is deprecated and will be removed in a future
release
数字类型如果要求高精度,则可以使用Decimal类型,可以指定精度和标度(小数点后多少位),避免执行计算时出现一些意想不到的错误。
02—整型做主键推荐用bigint
整形类型一般会 用于表的主键,结合auto_increment实现自增ID的功能,但是如果业务场景会出现海量数据,则最好使用bigint类型,因为int类型最大范围在42亿的级别,如果业务场景每天会产生海量数据,那么达到上限范围就很容易了,所以推荐一开始就用Bigint,数值范围会大很多,虽然会比int多占4个字节的空间,否则一旦达到上限才去修改数据表的结构,由于已经有海量数据,那将非常痛苦(需要做迁移)。
03—自增ID可能不会持久化
假设数据表已经插入3条数据,如果我删除掉这其中任意一条或者多条数据,下一条数据的ID也应该是4,这在我们平常开发也见多了,觉得这应该没啥问题,然而当我们讲数据库进行了重启,这时候再去插入数据,ID就不是4了,自增值会发生回溯,比如仍然是3(取决于前面删掉了多少条数据)。这个问题在mysql8.0版本已经得到了解决,即每张表的自增值会持久化,重启数据库后不会发生回溯
04—总结
本篇分享了几个mysql可能会遇到的坑,在平常测试场景或者非极端情况下可能遇不到,但是仍然需要记忆或者形成一个习惯,避免有时候因为这些坑出现bug而需要花费大量时间进行排查
文章转载自CoderShare