1. 程式人生 > >MySQL中關於金額資料進行運算求和/整數時精度丟失/清空表資料,自增從1開始

MySQL中關於金額資料進行運算求和/整數時精度丟失/清空表資料,自增從1開始

關於MySQL的使用總結:

1.金額欄位型別為String時,進行求和運算

之前在MySQL資料庫使用金額欄位的時候,由於有小數位,可能大家第一印象是使用double型別的,但是在實際使用 的過程當中可能會發現double型別的資料,在進行運算的時候會產生精度丟失的問題。

這次做一個小專案,同事設計資料庫的時候設定成了varchar,當時第一次看到這個感覺很神奇,不明白他怎麼想的,在我使用的過程中,由於要對前臺傳來的資料進行解析,解析出裡面的金額資料。

在擷取的過程中,直接獲取到一個String型別的金額資料,於是便直接插入到資料庫裡了。

今天客戶又加了個需求讓後臺顯示總得金額,於是我便後悔,為什麼不提前把金額的欄位改成double的,String型別的也沒法求和啊。。。。。。。

果然是技術菜限制了我的想象,MySQL竟然可以直接對String型別的資料進行運算,前提是轉換成decimal型別,於是問題便迎刃而解了,不然按照我的本方法,將資料型別改為double,然後再改實體類,我感覺至少得夠我折騰半天的,並且寫好的功能也有可能會受影響。

解決辦法:

  1. 使用cast函式,將varchar或char型別轉換成decimal型別在進行計算
select  sum(cast(money as  decimal(10,2)))  as  money  from table

其中decimal中的10代表除了小數位,最多的資料有效位數,也就是說最大可以是99999999.99
後面的2代表精度,也就是小數有效位,當資料的有效位大於2時,則進行四捨五入運算,小於2時補0填充位數。

  1. 另一個類似的函式:convert
select  price from TABLE  order by CONVERT (price , DECIMAL) desc

2.查詢DECIMAL型別資料小數點後精度缺失丟失為0的小數

利用SSM框架查詢資料庫資料時,當資料庫資料型別為decimal(18,2),此時若資料庫資料為12.34,後臺獲取結果也為12.34,這時看上去資料獲取沒有任何問題,但是當資料庫資料為22.00,後臺獲取結果則變為22,小數點後兩位.00丟失,即精度缺失.

這是由於mybatis在進行資料對映的時候,若資料庫中欄位的型別是decimal、float、double,java類對應欄位的型別為BigDecimal、Float、Double時,對映得到的資料不會保留值為0的小數位,此時可將java對應欄位轉換為string型別,即改變實體類中變數型別。若查詢結果返回型別不是該實體類,而是一個整合的map集合,此時不用去修改實體類中對應的變數型別,畢竟修改實體類,專案內修改涉及面可能比較廣,此時可在mybatis的XML檔案內,將decimal或其他數字型別在SQL語句內強制轉換為字串型別,再進行資料對映。

例如book實體類中amount欄位在資料庫為decimal(18,2)型別,正常在mybatis的XML檔案內的sql查詢為:

<select id="selectByPrimaryKey" parameterType="java.lang.String" resultType="com.entity.Book">
	SELECT  id,bookName,amount from book where id=#{id}
</select>

此時,可將其修改為:

<select id="selectByPrimaryKey" parameterType="java.lang.String" resultType="java.util.Map">
	SELECT  id,bookName,CAST(amount AS CHAR) amount 
             from book where id=#{id}
</select>

這樣當資料庫中amount資料為22.00時,後臺獲取到的資料也為22.00。

3.清空表的資料,id自增從1開始的方法

可以直接在xml檔案中寫一條類似查詢的SQL語句或者使用update也行,然後向普通的mapper介面一樣,直接呼叫即可,唯一一點要注意的是返回型別必須為void,否則會報錯。

  <select id="deleteALL">
  	TRUNCATE TABLE 表名
  </select>