mysql 貨幣型別 選擇

del88發表於2024-04-24

結論:我們的選擇是int 和 bigint ,以分為單位來存;

一個外國人的影片 講解了,我直接按重點截圖了,連線地址:【在MySQL中儲存貨幣的正確方式:不要使用 float 或 double ,要用 decimal 或 integer/bigint !】https://www.bilibili.com/video/BV15N4y147YE?vd_source=025a1c967fa95b3dcfb9b276f7348163

我們對比下 decimal 和 int/bigint;先看下 若以分為單位 儲存的金額範圍:

MySQL型別 以分為單位取值範圍 佔用的位元組
int -21474836.48元 --> 21474836.47 元 4
Bigint -92233720368547758.08 元 --> 92233720368547758.07 元 8

若要達到 同樣的取值範圍,我們看下 使用decimal的情況:

取值範圍 需要的MySQL型別 位元組
-21474836.48元 --> 21474836.47 元 decimal(10, 2) DECIMAL(10, 2)在MySQL 8中大概會佔用6到8個位元組或更多
-92233720368547758.08 元 --> 92233720368547758.07 元 decimal(19, 2) DECIMAL(19, 2)在MySQL 8中大概會佔用更多的位元組,可能是12到16個位元組或更多

可見:

  1. 貨幣若用 decimal 在MySQL層面會佔用 更多的位元組;
  2. 貨幣若用decimal 還存在 MySQL 型別 --> Java型別---> delphi型別 轉換的問題;比如 Java裡只能使用BigDecimal,比較麻煩;

MySQL裡的decimal對應Java和Delphi中的型別如下:

1. 在Java中:

  • MySQL的decimal對應Java中的BigDecimal型別。
  • 原因:BigDecimal在Java中用於表示任意精度的小數值,它使用BigInteger維護精度,在運算過程中不會丟失精度。這種特性使得BigDecimal非常適合與MySQL中的decimal型別相對應,因為兩者都是用於儲存精確的小數值。

2. 在Delphi中:

  • MySQL的decimal可以對應Delphi中的CurrencyVariant型別,但更常用的是使用第三方庫或自定義記錄型別來處理高精度的小數。
  • 說明:Delphi本身沒有直接等同於Java中BigDecimal的型別,但可以使用Currency型別來處理固定小數點的高精度數值。如果需要更高的精度和靈活性,開發人員通常會使用如GNU MP Bignum Library(GMP)之類的庫,或者定義一個自定義的記錄型別來儲存和處理大數值。

總的來說,由於不同程式語言和環境的差異,對於高精度小數的處理可能會有所不同。在Java中,BigDecimal是處理這類數值的理想選擇,而在Delphi中,可能需要結合使用內建型別或第三方庫來達到類似的功能。

image
image
float double 不精確
image
image
image
image
image
image
image
image

相關文章