首页 > 数据库 >mysql 货币类型 选择

mysql 货币类型 选择

时间:2024-04-24 12:22:22浏览次数:23  
标签:Java BigDecimal decimal mysql 货币 MySQL 类型 字节

结论:我们的选择是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

标签:Java,BigDecimal,decimal,mysql,货币,MySQL,类型,字节
From: https://www.cnblogs.com/del88/p/18155013

相关文章

  • Mysql:canal-deployer:如何阻断canal-client对deployer上的filter过滤条件订阅修改:https
     也算是安全管理上的一个控制点:本来,允许客户端去根据自己的实际需求去服务端订阅自己关心的数据流,是很好的。but,但是,服务端的黑白名单过滤,尤其是白名单的filter条件会被客户端的最新订阅的过滤条件给覆盖!!!这算是bug吗?上游服务端怎么显得那么没地位呢!!!??? #===================......
  • MySql 规范
    强制要求类型MySQLJavaDelphi备注日期(Date)、日期时间(DateTime)BigIntLongInt64通常单位为秒即可,特殊情况下才可以使用毫秒;Boolean值Tinyint(1),要求非空BooleanBooleanmybatis-generator也会自动生成Boolean,声明一个is_activeboolean类型示例:CREATETA......
  • 解决Long类型在前端、后端传输精度丢失问题
    @ConfigurationpublicclassJacksonConfiguration{/***DateTime格式化字符串*/privatestaticfinalStringDEFAULT_DATETIME_PATTERN="yyyy-MM-ddHH:mm:ss";/***Date格式化字符串*/privatestaticfinalStringDEFAUL......
  • centos7删除mysql的步骤
    centos7删除mysql的步骤方法一、1.查看安装了mysql哪些服务rpm-qa|grep-imysql2、然后逐个去卸载卸载前关闭mysql服务rpm-ev--nodepsmysql-community-release-el7-5.noarchrpm-ev--nodepsmysql-community-common-5.6.38-2.el7.x86_64rpm-ev--nodepsmysql-co......
  • 菜单权限表sqlite和mysql
    sqliteCREATETABLEsys_user(idTEXTPRIMARYKEY,nameTEXTNOTNULL,phoneTEXT,passwordTEXTNOTNULL,create_timeDA......
  • ECMAScript(简称 ES)是一种由 Ecma 国际组织制定的脚本语言标准,用于定义脚本语言的语法
    ECMAScript(简称ES)是一种由Ecma国际组织制定的脚本语言标准,用于定义脚本语言的语法、类型、语义和其他核心特性。它的设计初衷是为了使不同的浏览器和开发者能够使用一致的语法和特性开发Web应用程序,从而提高跨平台和跨浏览器的互操作性。ECMAScript标准的制定由Ecma......
  • mysql 执行计划
    https://www.modb.pro/db/1776807735064104960一、mySql的执行顺序mysql执行sql的顺序从From开始,以下是执行的顺序流程1、FROMtable1leftjointable2on将table1和table2中的数据产生笛卡尔积,生成Temp12、JOINtable2所以先是确定表,再确定关联条件3、ONtable1.column......
  • 连接mysql -- host is not allowed to connect to this mysql server的解决
    今天通过navicat连接服务器的MySQL,报错:hostisnotallowedtoconnecttothismysqlserver去网上搜了一摞,有些方法不太管用,踩了点坑,在此记录下。版本:MYSQL8.0.36,CentOS7mysql-uroot-pusemysql;selectuser,hostfromuser;这时候可以看到:只允许localhost......
  • MYSQL使用binlog恢复数据
    要使用MySQL的二进制日志(binlog)恢复被删除的数据,你需要确保二进制日志功能已经开启,并且已经有足够的日志记录来恢复数据。以下是恢复数据的基本步骤和示例代码:1、确认二进制日志功能已经开启:查看my.cnf(或my.ini)配置文件,确保log_bin变量设置为非空值,或者使用以下SQL命令SHOWVAR......
  • python3下安装mysqlclient各种报错 raise OSError mysql_config not found
    linux下载地址:https://files.pythonhosted.org/packages/a5/e1/e5f2b231c05dc51d9d87fa5066f90d1405345c54b14b0b11a1c859020f21/mysqlclient-2.0.1.tar.gz#sha256=fb2f75aea14722390d2d8ddf384ad99da708c707a96656210a7be8af20a2c5e5在服务器执行pipinstallmysqlclient-2.0.......