处理 MS-SQL 和 PostgreSQL 货币数据类型之间的差异

Ram*_*ini 0 postgresql pgadmin money postgresql-9.4

这是我上一个问题的后续/是否可以在 PostgreSQL 中插入货币数据类型的未格式化数据

  1. 我可以通过将其类型转换为数字来读取货币数据

     SELECT '52093.89'::money::numeric
    
    Run Code Online (Sandbox Code Playgroud)

    它会给出不一致的数据,四舍五入等吗?

  2. 根据 ISO 标准,money数据类型大小为 (19,4) 但为什么 PostgreSQL 返回大小为 2147483647?这个大小取决于语言环境吗?

  3. 使用money数据类型来存储/检索特定于区域设置的值是个好主意吗?如果不是,什么时候money数据类型最合适?

我必须在money某些情况下使用数据类型。我担心的是,如果我将money数据类型值视为十进制值,我会遇到任何问题吗?

我不关心特定于语言环境的值,例如符号、数字和十进制分组等。我可以根据lc_monetary设置存储货币数据类型值并通过将其类型转换为读取numeric吗?

Erw*_*ter 6

在 Postgres 中,从moneyto 的转换numeric是精确的、不可变的并且不舍入。

在 SQL Server 中,数据类型MONEY使用 8 个字节来存储数值范围从 -922337203685477.5808 到 922337203685477.5807 的任何货币的值。
匹配numeric(19,4)

在 PostgreSQL 中,数据类型money也占用 8 个字节,但允许的范围是 -92233720368547758.08 到 +92233720368547758.07。相同的精度,但默认情况下不同的比例(LC_MONETARY除了 'C' 之外没有设置) - 只有两个小数位。
匹配numeric(19,2)

但是,引用手册

小数精度由数据库的lc_monetary设置决定。

我相应地更新了的标签信息。

正如@a_horse 所评论的(反复),moneySQL 标准没有定义。

如果可以的话,远离数据类型几乎是这里的共识money