amphp / postgres

Async Postgres client for PHP based on Amp.
MIT License
97 stars 20 forks source link

Numeric converted to float instead of string #66

Closed martinoshub closed 1 month ago

martinoshub commented 1 month ago

Hi guys. Please tell me that there's a way without altering your code to make sure that when fetching a row from the database, a Numeric type gets converted to string instead of float? Choosing to make float the default type means there's potential data loss and no way to recover. Whereas with a string type I could always convert it to float if I wanted to.

Internal/PgSqlResultIterator.php

        'N' => match ($oid) { // Numeric
            700, 701, 1700 => (float) $value, // float4, float8, and numeric to float
            790 => $value, // money includes currency symbol as string
            default => (int) $value, // All other numeric types cast to an integer
        },

It would be great to have a way to change this behavior while setting up the class so that numerics are returned as a string. Thanks so much. And thank you for this wonderful library by the way, I really love Amphp with fibers and it's great that there's a Postgres lib for it.

Bilge commented 1 month ago

If you want to store floats as stings then change the column type.

martinoshub commented 1 month ago

If you want to store floats as stings then change the column type.

I don't want to store floats. I don't want to use floats. I want to work with precise numeric types. That is Numeric() in Postgres. The closest thing in PHP (assuming data is preserved, which is a must when you're managing financial entries) is a string.

trowski commented 1 month ago

Hi @martinoshub!

Thank you for pointing out this issue. This was a discrepancy between the ext-pq implementation, which returns a string) and the ext-pgsql implementation, which was wrongly returning a float. I've updated the ext-pgsql implementation to also return a string.

The fix has been tagged under v2.1.0.