香港马会开奖结果,六合彩资料 六开彩开奖现场直播 六合彩资料大全 地下六合彩 六合彩图库 六合彩图 香港六合彩网站 六合彩大全 香港六合彩图库 六合彩开 六合彩挂牌 香港六合彩挂牌 六合彩票 六合彩现场直播 六合彩玄机 香港六合彩公司 www.dq-ccg.com六合彩官网 香港六合彩特码 六合彩管家婆 六合彩走势图 六合彩结果 六合彩马报 香港六合彩现场直播 六合彩白小姐 白小姐六合彩 六合彩直播 六合彩特码资料 六合彩免费资料 六合彩曾道人 香港六合彩资料大全 六合彩开码结果 香港六合彩管家婆 六合彩综合资料 香港六合彩网址 六合彩彩图 香港六合彩图 六合彩信息 今晚六合彩开什么 六合彩开什么 六合彩图纸 香港六合彩特码资料 香港马会六合彩 六合彩图片 六合彩预测 香港六合彩网 香港六合彩直播 香港地下六合彩 香港六合彩官方网站 六合彩全年资料 六合彩脑筋急转弯 六合彩官方网站 六合彩查询 六合彩开码现场 六合彩报 香港六合彩论坛 六合彩天线宝宝 香港六合彩结果

Baidu

一聚教程网:一个值得你收藏的教程网站

MySQL中浮点型转字符型可能会遇的问题详解

时间:2017-10-05 11:44:00 编辑:猪哥 来源:转载

前言

本文主要给大家介绍了MySQL中在将浮点型转字符型的时候遇到的一个问题,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。

一 问题描述

今天遇到一个刷数据的需求,是修改产品的重量(字段类型为float),修改了产品的重量之后,是需要记录到日志表中的(字段类型为varchar),表结构如下:

临时刷数据表:

CREATE TABLE `temp_170830` (
 `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
 `goods_sn` varchar(255) NOT NULL DEFAULT '' COMMENT '产品编码',
 `goods_weight` float(9,4) NOT NULL DEFAULT '0.0000' COMMENT '产品重量',
 `actual_weight` float(9,4) NOT NULL DEFAULT '0.0000' COMMENT '实际重量',
 `new_actual_weight` float(9,4) NOT NULL DEFAULT '0.0000' COMMENT '新的实际重量',
 `create_user` varchar(30) NOT NULL DEFAULT '' COMMENT '创建人',
 PRIMARY KEY (`id`),
 KEY `idx_goods_sn` (`goods_sn`)
) ENGINE=InnoDB AUTO_INCREMENT=8192 DEFAULT CHARSET=utf8 COMMENT='临时刷重量表';

日志表:

CREATE TABLE `log_weight` (
 `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
 `goods_sn` varchar(50) NOT NULL DEFAULT '' COMMENT '产品编码',
 `which_col` varchar(100) NOT NULL DEFAULT '' COMMENT '修改字段',
 `old_value` varchar(50) NOT NULL DEFAULT '0.00' COMMENT '更新前值',
 `new_value` varchar(50) NOT NULL DEFAULT '0.00' COMMENT '更新后值',
 `update_user` varchar(100) NOT NULL DEFAULT '' COMMENT '创建人',
 `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
 `wh_update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '记录修改时间',
 PRIMARY KEY (`id`),
 KEY `idx_goods_sn` (`goods_sn`),
 KEY `idx_update_user` (`update_user`),
 KEY `wh_update_time` (`wh_update_time`)
) ENGINE=InnoDB AUTO_INCREMENT=14601620 DEFAULT CHARSET=utf8 COMMENT='重量修改日志';

如上面建的表所示,我需要将temp_170830表的actual_weight和new_actual_weight字段分别刷入log_weight表的old_value和new_value字段,SQL语句如下:

INSERT INTO log_weight(goods_sn, which_col, old_value, new_value, update_user)
SELECT goods_sn,'actual_weight',actual_weight,new_actual_weight,create_user FROM temp_170830;

本来以为到这里就已经大功告成了,毕竟只是插入一些日志记录,后来为了简单的进行核对,发现数据有些不对劲,如下图所示:

临时表数据截图:

MySQL中浮点型转字符型可能会遇的问题详解

日志表数据截图:

MySQL中浮点型转字符型可能会遇的问题详解

对比可以发现,插入的日志记录数据无缘无故后面多了很多位的小数,不知道从哪里冒出来的,后来一想,可能是本来浮点型的数据就是除不尽的,转成varchar的时候就把后面的那些也给带出来了,暂时也不是很确定,后续确定之后再补充,然后自己临时找了一个转varchar的方法concat,调整如下:

INSERT INTO log_weight(goods_sn, which_col, old_value, new_value, update_user)
SELECT goods_sn,'actual_weight',concat(actual_weight,''),concat(new_actual_weight,''),create_user FROM temp_170830;

顺利解决日志记录问题。

总结如下:

1 在记录价格和重量数字字段的时候,尽量不要使用浮点型!!!,浮点数坑多(比如浮点型是不能判断相等的!!!),最好是采用int整型,业务上要显示小数时,读取出来再除以相应的位数,比如99.98元,应存储9998,读取出来时,用9998/100来显示。

2 在float转varchar时,应该先把float用concat函数先转成varchar,再存储入varchar字段。

文章评论

热门栏目

香港马会开奖结果,六合彩资料 六开彩开奖现场直播 六合彩资料大全 地下六合彩 六合彩图库 六合彩图 香港六合彩网站 六合彩大全 香港六合彩图库 六合彩开 六合彩挂牌 香港六合彩挂牌 六合彩票 六合彩现场直播 六合彩玄机 香港六合彩公司 六合彩官网 香港六合彩特码 六合彩管家婆 六合彩走势图 六合彩结果 六合彩马报 香港六合彩现场直播 六合彩白小姐 白小姐六合彩 www.dq-ccg.com六合彩直播 六合彩特码资料 六合彩免费资料 六合彩曾道人 香港六合彩资料大全 六合彩开码结果 香港六合彩管家婆 六合彩综合资料 香港六合彩网址 六合彩彩图 香港六合彩图 六合彩信息 今晚六合彩开什么 六合彩开什么 六合彩图纸 香港六合彩特码资料 香港马会六合彩 六合彩图片 六合彩预测 香港六合彩网 香港六合彩直播 香港地下六合彩 香港六合彩官方网站 六合彩全年资料 六合彩脑筋急转弯 六合彩官方网站 六合彩查询 六合彩开码现场 六合彩报 香港六合彩论坛 六合彩天线宝宝 香港六合彩结果