MySQL数据类型DECIMAL用法

嘿,让我告诉你这个小数的事情。
去年我在一个电商项目中使用它来处理订单金额,这确实需要注意细节。

看,小数的两个参数(p,d)需要仔细考虑。
P为总位数,D为小数点后位数。
例如,如果您创建decimal(1 0,2 ),则表示总共有1 0 位数字和两位小数。
您想保存 9 9 9 9 9 9 9 9 .9 9 吗?没问题。
但如果你想保存1 2 3 4 .5 6 ,那就不行了,因为整数部分只有4 位数字,这还不够。

那年我差点把3 位字段改成小数点后2 位,幸好同事提醒了我。
如果你保存的数字大于精度,MySQL在严格模式下会直接报错,在非严格模式下会帮你截断,并且可能不会提示你。
因此,在设计表格时,需要考虑清楚可以存储的最大大小以及需要多少位小数,以确保无法输入超出该点的数据。

输入数据时,会自动四舍五入。
例如,如果将 1 5 .6 7 8 放入 DECIMAL(5 ,2 ),则实际存储的值为 1 5 .6 8 这个东西和FLOAT/DOUBLE不同。
float/double 是近似值,而小数是精确值。
我以前在项目中使用FLOAT来存储金额,但财务部门最终说一堆数字不匹配,所以我改用DECIMAL来解决。

查询时计算也很准确它发生了。
比如要计算折扣价,直接用value(1
discount_rate),结果就不会乱了。
去年我计算了一次促销,使用DECIMAL计算的结果与财务结果一致,省去了很多麻烦。

但是,十进制计算比 FLOAT/DOUBLE 稍慢,因为它们必须确保每一位都计算正确。
如果要做大规模计算,可能要考虑先在程序中进行计算,而不是在数据库中重复计算,这样会影响性能。

一般来说,如果您想保存精度要求较高的货币和金融数据,那么使用 DECIMAL 就适合您。
比如税率,利率,或者任何需要固定小数位数的东西,这个都是合适的。
P和D必须设置得足够大,否则数据将丢失。
我建议多预留一些,这样到时候就不会用完。

MySQL怎么使用check约束

哈,我对数据库真是又爱又恨。
上周,一位客户问我MySQL的CHECK限制是否有效,我直接给他看了。
仔细想想,这其实是一种欺骗。
2 02 3 年我在北京做一个项目,使用的是InnoDB引擎,当时我想给表加一个检查限制,限制用户的年龄不能超过1 8 岁。
结果呢?当我写SQL的时候似乎可以通过,但是当我输入“1 7 年”数据时,没有报错!这正是MySQL官方文档所说的——它只是解析语法,当你输入正确时忽略CHECK。
当时我很困惑,以为我把 SQL 打错了。

所以如果你确实想限制数据的范围,例如小数位数必须大于0或者邮政编码必须是六位数字,你需要寻找另一种方法。
我一般使用两种方法
1 ENUM类型:适合唯一值。
例如,对于性别,您只能选择“男”或“女”。
您的用户表示例非常典型。
性别字段使用 ENUM('Male','Female')。
然后我尝试输入“秀吉”,并立即收到错误“第 1 行‘性别’列的数据被截断”。
这很有效,但缺点是 ENUM 无法处理连续范围。
例如年龄不能为1 8 .5 ,只能采用默认值。
2 .触发器:这是MySQL处理范围约束的实际方式。
你的激活码在进入用户之前是很标准的,如果余额小于1 00,就会设置为1 00。
我之前在2 02 2 年的金融系统中就用过这个方法,效果不错。
我还使用 DELIMITER$$ 语法来防止与触发器中的分号发生冲突。

但是触发器也有缺陷。
例如,2 02 1 年,上海搭建了一个电商系统,使用触发器限制商品数量不小于0。
众所周知,在大型会议下会出现一些问题——同时输入两个请求,其中一个被减为负数,触发器将负数变为0,这会导致库存统计不正确。
此时我们添加了互斥锁并解决了问题。

不管怎样,MySQL检查块是没有用的。
如果你会使用 ENUM 就很容易了。
如果需要范围限制,只需使用触发器即可。
由你决定。