会员中心的积分和金额字段,为什么设计成整型的。不应该是小数类型吗。
不明白,会员中心的积分和金额字段,为什么设计成整型的。不应该是小数类型吗。
二次开发时,才发现这问题的。money score字段都是int类型的。 建议改为decimal类型吧,方便记录元角分或后期开发分销分红占百分比等业务。
请先登录
不明白,会员中心的积分和金额字段,为什么设计成整型的。不应该是小数类型吗。
二次开发时,才发现这问题的。money score字段都是int类型的。 建议改为decimal类型吧,方便记录元角分或后期开发分销分红占百分比等业务。
-- Table structure for ba_user_score_log
DROP TABLE IF EXISTS
ba_user_score_log
;CREATE TABLE
ba_user_score_log
(id
int(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'ID',user_id
int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '会员ID',score
decimal(18, 2) NOT NULL DEFAULT 0.00 COMMENT '变更积分',before
decimal(18, 2) NOT NULL DEFAULT 0.00 COMMENT '变更前积分',after
decimal(18, 2) NOT NULL DEFAULT 0.00 COMMENT '变更后积分',memo
varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '备注',create_time
bigint(16) UNSIGNED DEFAULT NULL COMMENT '创建时间',PRIMARY KEY (
id
) USING BTREE) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '会员积分变动表' ROW_FORMAT = Dynamic;
-- Table structure for ba_user_money_log
DROP TABLE IF EXISTS
ba_user_money_log
;CREATE TABLE
ba_user_money_log
(id
int(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'ID',user_id
int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '会员ID',money
decimal(18, 2) NOT NULL DEFAULT 0.00 COMMENT '变更余额',before
decimal(18, 2) NOT NULL DEFAULT 0.00 COMMENT '变更前余额',after
decimal(18, 2) NOT NULL DEFAULT 0.00 COMMENT '变更后余额',memo
varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '备注',create_time
bigint(16) UNSIGNED DEFAULT NULL COMMENT '创建时间',PRIMARY KEY (
id
) USING BTREE) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '会员余额变动表' ROW_FORMAT = Dynamic;
-- Table structure for ba_user
DROP TABLE IF EXISTS
ba_user
;CREATE TABLE
ba_user
(id
int(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'ID',group_id
int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '分组ID',username
varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '用户名',nickname
varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '昵称',email
varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '邮箱',mobile
varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '手机',avatar
varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '头像',gender
tinyint(4) UNSIGNED NOT NULL DEFAULT 0 COMMENT '性别:0=未知,1=男,2=女',birthday
date DEFAULT NULL COMMENT '生日',money
decimal(18, 2) UNSIGNED NOT NULL DEFAULT 0.00 COMMENT '余额',score
decimal(18, 2) UNSIGNED NOT NULL DEFAULT 0.00 COMMENT '积分',last_login_time
bigint(16) UNSIGNED DEFAULT NULL COMMENT '上次登录时间',last_login_ip
varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '上次登录IP',login_failure
tinyint(4) UNSIGNED NOT NULL DEFAULT 0 COMMENT '登录失败次数',join_ip
varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '加入IP',join_time
bigint(16) UNSIGNED DEFAULT NULL COMMENT '加入时间',motto
varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '签名',password
varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '密码',salt
varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '密码盐',status
varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '状态',update_time
bigint(16) UNSIGNED DEFAULT NULL COMMENT '更新时间',create_time
bigint(16) UNSIGNED DEFAULT NULL COMMENT '创建时间',PRIMARY KEY (
id
) USING BTREE,UNIQUE INDEX
username
(username
) USING BTREE) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '会员表' ROW_FORMAT = Dynamic;
片面了
积分字段设置为整数,余额字段可以是小数
数据库设置的decimal取到php里面就成浮点数了,只要你计算或者比较肯定会出问题。
我是这么做的数据库存成收整数以分为单位,使用的时候除以100,存的时候乘以100,只要计算或者比较都使用原始的整数
decimal取到php里面就成浮点数 php里比较没问题的。现在php8还有强类型呢。
除以100这个是不可取的,(1)个问题是int本身就11位。不够用啊。在有符号类型下,INT类型最大值为2147483647,即2的31次方减一; 假如要保留4位小数吧 214748.3647 才21万。金额是100万 1000万 1个亿怎么办?
(2) 写程序容易忘记除100,或重复几次除100。
1.强类型也不能拿浮点数做计算和比较
2.模型里面获取器里除100,修改器里乘100. 计算比较的时候使用getData()获取原始值。
3.转账不可能转0.01以下的,所以一般不会有4位小数的场景,bigint应该是够用的。但凡涉及金额处理个人觉得不要嫌麻烦。
我只是说点自己的理解也不是最优解,你自己使用顺手就行。
等你遇到的时候会哭的!所有数SUM就不等于预期数,每个数的还都对,用计算器按一遍也没毛病。
- 1
前往