如何在运行查询时更改数据类型(不在PHP内)

Vla*_*mir 2 php mysql mysqli pdo

说明

当在MySQL内部对小数进行精确数学运算时,它将字符串处理为Float而不是固定,例如,如果我们在数据库中有以下列(金额类型为DECIMAL(43,20))

+--------------------------+
|         amount           |
+--------------------------+
|  0.20000000000000000000  |
+--------------------------+
Run Code Online (Sandbox Code Playgroud)

运行以下PHP代码

$amount_to_add = "0.1";
$stmt = $dbh->prepare("UPDATE table SET amount = amount + :amount");
$stmt->bindValue("amount", $amount_to_add);
$stmt->execute();
Run Code Online (Sandbox Code Playgroud)

会导致这样的:

+--------------------------+
|         amount           |
+--------------------------+
|  0.30000000000000004000  |
+--------------------------+
Run Code Online (Sandbox Code Playgroud)

注意额外的0.0000000000000000 4000

因为$amount_to_add是字符串

因为我需要使用BC Math函数,所以它的输出总是字符串

And i can't convert it to double/float inside PHP because it will lose precision and decimal points

问题

我应该如何将它传递给MySQL以将其视为十进制(固定)而不是字符串(浮点数),这不需要在PHP中更改字符串类型?

是否可以在运行查询时声明数据类型?所以它在MySQL内部将字符串更改为十进制

Uue*_*rdo 5

UPDATE table SET amount = amount + CAST(:amount AS DECIMAL(X, Y))
Run Code Online (Sandbox Code Playgroud)