Php 在mysqli中处理十进制数

Php 在mysqli中处理十进制数,php,floating-point,mysqli,floating-accuracy,floating-point-precision,Php,Floating Point,Mysqli,Floating Accuracy,Floating Point Precision,我必须将一些项目的价格放入mysql表中。创建表时,我使用的是十进制(10,2),因为逗号后不需要超过2位数字(例如:123,45将被接受为输入,但123456将被PHP四舍五入为123,45) 第一个问题:使用十进制(10,2),我如何知道逗号前可以存储多少个数字?我知道它不是10,因为10只是Mysql在计算这些数字时使用的精度:那么数字本身的长度是在哪里指定的呢 第二个问题:我正在使用PHP对用户输入进行四舍五入以适应数据类型(逗号后有两个数字的浮点)。我应该如何使用mysqli->bin

我必须将一些项目的价格放入mysql表中。创建表时,我使用的是
十进制(10,2)
,因为逗号后不需要超过2位数字(例如:123,45将被接受为输入,但123456将被PHP四舍五入为123,45)

第一个问题:使用
十进制(10,2)
,我如何知道逗号前可以存储多少个数字?我知道它不是10,因为10只是Mysql在计算这些数字时使用的精度:那么数字本身的长度是在哪里指定的呢

第二个问题:我正在使用PHP对用户输入进行四舍五入以适应数据类型(逗号后有两个数字的浮点)。我应该如何使用
mysqli->bind_param
插入这些数据?
bind_param
应该使用哪些(来自的)数据类型(以及可能的原因)

DECIMAL(10,2)
表示
10
是要使用的最大位数。
2
指定小数点右侧有两个。这意味着左侧还有
8个
数字。看

对于数据类型,应该使用
double
,因为这是十进制数


Integer
没有十进制字符,因此它将删除所有数字<代码>字符串
用于文本而非数值
Blob
用于二进制大对象,例如:图像

如果需要精确的缩放数值,我不建议使用
double
float
。请参见本问答部分mysql使用的
十进制
。只有bind param类型设置为double。它是给定类型中的唯一选项。您可以使用“s”字符串。如果您在php中用于存储值(Decimal)的数据类型有一个_toString方法(如果没有创建),那么php将在值传递给MySQL引擎之前将其转换为字符串,并且引擎将执行自己的类型转换,以处理字段类型的适当结果。对于像decimal这样需要比整数甚至double更高精度的类型来说,它很有用。当然,它可以工作,但是绑定类型的关键是确保不提供其他数据。因为如果您将绑定类型设置为
string
,我还可以将值设置为“我不是一个数字,我将打断您的查询”,代码将接受它。然后MySql会抛出错误(在正常情况下,它可能是隐藏的),您将不知道程序失败的原因。
Character   Description
i   corresponding variable has type integer
d   corresponding variable has type double
s   corresponding variable has type string
b   corresponding variable is a blob and will be sent in packets