首頁  >  文章  >  資料庫  >  MySQL中關於浮點型轉換成字元型出現的一些問題解決

MySQL中關於浮點型轉換成字元型出現的一些問題解決

黄舟
黄舟原創
2017-09-14 11:55:131901瀏覽

類型轉換是我們日常開發中經常會遇到的一個需求,最近在將浮點型轉換成字符型的時候就遇到了一個問題,所以總結分享出來,下面這篇文章主要給大家介紹了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中關於浮點型轉換成字元型出現的一些問題解決的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn