結論:我們的選擇是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個位元組或更多 |
可見:
- 貨幣若用 decimal 在MySQL層面會佔用 更多的位元組;
- 貨幣若用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中的Currency
或Variant
型別,但更常用的是使用第三方庫或自定義記錄型別來處理高精度的小數。 - 說明:Delphi本身沒有直接等同於Java中
BigDecimal
的型別,但可以使用Currency
型別來處理固定小數點的高精度數值。如果需要更高的精度和靈活性,開發人員通常會使用如GNU MP Bignum Library
(GMP)之類的庫,或者定義一個自定義的記錄型別來儲存和處理大數值。
總的來說,由於不同程式語言和環境的差異,對於高精度小數的處理可能會有所不同。在Java中,BigDecimal
是處理這類數值的理想選擇,而在Delphi中,可能需要結合使用內建型別或第三方庫來達到類似的功能。
float double 不精確