MySQL中关于浮点型转换成字符型出现的一些问题解决
技术百科
黄舟
发布时间:2017-09-14
浏览: 次 类型转换是我们日常开发中经常会遇到的一个需求,最近在将浮点型转换成字符型的时候就遇到了一个问题,所以总结分享出来,下面这篇文章主要给大家介绍了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;
本来以为到这里就已经大功告成了,毕竟只是插入一些日志记录,后来为了简单的进行核对,发现数据有些不对劲,如下图所示:
临时表数据截图:
日志表数据截图:
对比可以发现,插入的日志记录数据无缘无故后面多了很多位的小数,不知道从哪里冒出来的,后来一想,可能是本来浮点型的数据就是除不尽的,转成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字段。
# 来了
# 一个问题
# 给大家
# 所示
# 不多
# mysql
# 主键
# 浮点
# 转成
# 不是很
# 说了
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- php串口通信波特率怎么选_根据硬件手册设置正确波
- php485返回空数组怎么回事_php485数据接
- Windows10如何更改桌面图标间距_Win10
- Windows系统时间服务错误_W32Time服务
- 如何使用Golang实现文件追加操作_向已有文件追
- 如何使用Golang安装依赖库_管理模块和第三方包
- Win11怎么开启远程桌面连接_Windows11
- MAC怎么在照片中添加水印_MAC自带编辑工具文字
- Python深度学习实战教程_神经网络模型构建与训
- Python日志系统设计与实现_高可观测性架构实战
- Win11声音太小怎么办_Windows 11开启
- php订单日志怎么在swoole写_php协程sw
- Windows10系统怎么查看显卡型号_Win10
- php8.4如何实现队列任务_php8.4redi
- c++如何实现多态性_c++ 虚函数表原理与动态绑
- Win11系统更新后黑屏怎么办 Win11更新黑屏
- C++如何使用Qt创建第一个GUI窗口?(入门教程
- 用Python构建微服务架构实践_FastAPI与
- PHP主流架构怎么处理表单验证_规则与自定义【技巧
- 如何高效识别并拦截拼接式恶意域名 spam
- c++ nullptr与NULL区别_c++11空
- 如何在 Python 测试中动态配置 @backo
- Go 语言标准库为何不提供泛型切片的 Contai
- 如何在Golang中使用闭包_封装变量与函数作用域
- Win11怎么开启游戏模式_Windows11优化
- Windows蓝屏错误0x00000023怎么修复
- 如何高效删除 NumPy 二维数组中所有元素相同的
- MAC如何启用访达侧边栏显示_MAC Finder
- php在Linux怎么部署_LNMP环境搭建PHP
- PHP 中如何在函数内持久修改引用变量所指向的目标
- Win11怎么关闭资讯和兴趣_Windows11任
- Windows10无法连接到Internet_Wi
- Win11文件扩展名怎么显示_Win11查看文件后
- Windows10电脑怎么设置电源按钮_Win10
- 如何使用Golang实现容器自动化运维_Golan
- Windows 11怎么更改锁屏超时时间_Wind
- Win11怎么设置鼠标宏_Win11鼠标按键自定义
- Mac如何修复应用程序权限问题_Mac磁盘工具修复
- Win11怎么看电池循环次数_Win11笔记本电池
- Python面向对象实战讲解_类与设计模式深入理解
- WindowsUSB驱动安装异常怎么办_USB驱动
- TestNG的testng.xml配置文件怎么写
- Win11怎么关闭自动调节屏幕亮度_Windows
- php中self::能调用子类重写的方法吗_静态绑
- 如何在Golang中实现基础配置管理功能_Gola
- Windows 10怎么录屏_Windows 10
- 如何在 Django 中安全修改用户密码而不使会话
- 如何在 ACF 中正确更新嵌套多层 Group 字
- c++的位运算怎么用 与、或、异或、移位操作详解【
- PhpStorm怎么调试PHP代码_PhpStor

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='重量修改日志';
QQ客服