MySQL中浮点型转字符型只怕会遇的标题详解

发布时间:2019-05-24  栏目:sqlite  评论:0 Comments

MySQL中浮点型转字符型恐怕会遇的难题详解,mysql浮点

前言

本文主要给我们介绍了MySQL中在将浮点型转字符型的时候遇到的3个难题,分享出来供大家参照他事他说加以考察学习,下边话十分少说了,来一齐看看详细的牵线吧。

1 难点讲述

前些天碰到2个刷数据的必要,是修改产品的分量(字段类型为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;

本来感到到此处就已经马到功成了,终归只是插入一些日志记录,后来为了简单的拓展核查,开采数目有个别难堪,如下图所示:

不常表数据截图:

图片 1

日志表数据截图:

图片 2

比较能够窥见,插入的日记记录数据莫明其妙前边多了广大位的小数,不知道从哪儿冒出来的,后来一想,大概是本来浮点型的多少便是除不尽的,转成varchar的时候就把前面包车型地铁这几个也给带出去了,近来也不是很鲜明,后续鲜明之后再补偿,然后自身权且找了1个转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整型,业务上要来得小数时,读抽取来再除以相应的位数,比如9玖.玖八元,应存款和储蓄9998,读抽取来时,用9998/100来显示。

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

好了,以上正是那篇小说的全体内容了,希望本文的剧情对我们的学习大概干活有所自然的参照他事他说加以考查学习价值,尽管有问号大家能够留言交换,多谢大家对帮客之家的援助。

http://www.bkjia.com/Mysql/1227593.htmlwww.bkjia.comtruehttp://www.bkjia.com/Mysql/1227593.htmlTechArticleMySQL中浮点型转字符型可能会遇的问题详解,mysql浮点
前言
本文首要给大家介绍了MySQL中在将浮点型转字符型的时候蒙受的二个标题,分享…

前言

正文首要给大家介绍了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;

本来认为到此地就早已马到成功了,究竟只是插入一些日记记录,后来为了轻便的伸开甄别,发掘数目有个别狼狈,如下图所示:

一时表数据截图:

图片 3

日志表数据截图:

图片 4

对待能够发掘,插入的日记记录数据无缘无故后边多了数不胜数位的小数,不知情从哪个地方冒出来的,后来一想,大概是自然浮点型的数额正是除不尽的,转成varchar的时候就把前边的那么些也给带出来了,一时也不是很鲜明,后续明显以往再补充,然后自个儿有的时候找了3个转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整型,业务上要出示小数时,读收取来再除以相应的位数,比方9九.玖8元,应存款和储蓄99玖八,读收取来时,用99九百分之八十0来展示。

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

好了,以上正是那篇小说的全部内容了,希望本文的开始和结果对大家的读书或然职业具备自然的参阅学习价值,假诺有疑难大家能够留言沟通,多谢我们对剧本之家的扶助。

留下评论

网站地图xml地图