#postgres #pg #numeric #bigdecimal


Postgres' numeric <=> Rust's BigDecimal

6 releases

0.1.5 Sep 7, 2022
0.1.4 Sep 30, 2021
0.1.1 Aug 31, 2021

#520 in Database interfaces

Download history 814/week @ 2023-06-13 706/week @ 2023-06-20 211/week @ 2023-06-27 643/week @ 2023-07-04 576/week @ 2023-07-11 288/week @ 2023-07-18 637/week @ 2023-07-25 530/week @ 2023-08-01 1576/week @ 2023-08-08 1103/week @ 2023-08-15 1299/week @ 2023-08-22 1123/week @ 2023-08-29 1181/week @ 2023-09-05 1408/week @ 2023-09-12 1044/week @ 2023-09-19 605/week @ 2023-09-26

4,406 downloads per month
Used in 2 crates

MIT license

365 lines


A Rust datatype implementation for the Postgres Numeric type (ie the types listed in https://www.postgresql.org/docs/13/datatype-numeric.html under "decimal"/"numeric"), to be used with Rust's "Postgres" library. The full spectrum of Postgres' Numeric value range is supported.

This small Rust package has been created because currently the main "Postgres" library (https://docs.rs/postgres/0.19.1/postgres/index.html) does not provide a native datatype to read/write Numeric values.

We only implement the wire logic of Postgres' Numeric datatype. We didn't rewrite the whole logic of big number manipulation, rather we let that logic be implemented by the already popular BigDecimal package (https://docs.rs/bigdecimal/0.3.0/bigdecimal/).

Specifically, our new Rust datatype PgNumeric is simply an Optional BigDecimal. With None representing the Postgres Numeric value NaN, and all Some(..) representing Postgres Numeric numbers.

Listed on crates.io here: https://crates.io/crates/pg_bigdecimal.

Comparisons between similar packages

  • https://crates.io/crates/rust-decimal provides a rust native type, however it's represented as a 96 bit integer number + scaling bits + 1 sign bit. This means that "only" (quoting only here because it is still a large integer space) a small part of Postgres' Numeric values can be translated. In our case it was not sufficient.


~361K SLoC