Edit report at https://bugs.php.net/bug.php?id=81397&edit=1
ID: 81397
Updated by: cmb@php.net
Reported by: me at derrabus dot de
Summary: PDO_sqlite: DECIMAL values from results are cast to
float
Status: Open
-Type: Bug
+Type: Documentation Problem
Package: PDO SQLite
Operating System: macOS 11.5
PHP Version: 8.1.0beta3
Block user comment: N
Private report: N
New Comment:
Not sure how to proceed here. Switching to doc problem might be
appropriate.
Previous Comments:
------------------------------------------------------------------------
[2021-08-29 14:04:06] cmb@php.net
Yes[1]. But even in older PHP versions, the returned string was
not necessarily exact, because SQLite3 internally stores the value
as IEEE 754 binary64 (aka. double).
[1] <https://github.com/php/php-src/blob/php-8.1.0beta3/ext/pdo_sqlite/sqlite_statement.c#L267-L299>.
------------------------------------------------------------------------
[2021-08-29 13:13:43] me at derrabus dot de
So in other words, PDO could not tell apart DECIMAL from REAL in result sets because SQLite does not
provide that information?
------------------------------------------------------------------------
[2021-08-29 12:05:09] cmb@php.net
SQLite3 is special, since it has no strong typing. Instead it
uses concepts called "type affinity" and "storage class". If you
declare a column of type DECIMAL, it is actually treated as having
NUMERIC type affinity, and numbers are stored either as INTEGER or
REAL. So there is no way of having precise decimals anyway.
You'd need to do the scaling yourself, and declare the column as
INT (or anything that forces INTEGER type affinity).
See also <https://www.sqlite.org/datatype3.html>.
------------------------------------------------------------------------
[2021-08-29 11:19:05] me at derrabus dot de
# A docker-compose.yml that sets up the environment I used:
version: '3.6'
services:
mysql:
image: 'mysql'
ports:
- '3306:3306'
environment:
- MYSQL_DATABASE=test
- MYSQL_USER=testuser
- MYSQL_PASSWORD=testpassword
- MYSQL_RANDOM_ROOT_PASSWORD=yes
postgres:
image: 'postgres'
ports:
- '5432:5432'
environment:
- POSTGRES_DB=test
- POSTGRES_USER=testuser
- POSTGRES_PASSWORD=testpassword
------------------------------------------------------------------------
[2021-08-29 11:15:45] me at derrabus dot de
I've updated the title to something more meaningful.
------------------------------------------------------------------------
The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at
https://bugs.php.net/bug.php?id=81397
--
Edit this bug report at https://bugs.php.net/bug.php?id=81397&edit=1