【发布时间】:2019-12-10 08:30:19
【问题描述】:
我有一个关于 PDO 和 Postgres 的问题:
当我尝试通过integer 字段搜索float 值时遇到错误:
$stmt = $con->prepare('SELECT t.* FROM my_table t WHERE t.integer_field > ?');
$stmt->execute([9.5]);
这也行不通:
$stmt = $con->prepare('SELECT t.* FROM my_table t WHERE t.integer_field > ?');
$stmt->execute(['9.5']);
这也行不通:
$stmt = $con->prepare('SELECT t.* FROM my_table t WHERE t.integer_field > ?');
$param = 9.5;
$stmt->bindParam(1, $param, \PDO::PARAM_INT);
$stmt->execute();
错误:Invalid text representation: 7 ERROR: invalid input syntax for integer: "9.5"
这是设计使然还是 postgres/pdo 不兼容?
顺便说一句,当我内联不带引号的浮点数时它可以工作:
$stmt = $con->prepare('SELECT t.* FROM my_table t WHERE t.integer_field > 9.5');
$stmt->execute();
而且 postgres 不会对 int 进行类型处理,因为我在运行这些查询时会看到不同的记录:
$con->prepare('SELECT t.* FROM my_table t WHERE t.integer_field < 5.1');
$con->prepare('SELECT t.* FROM my_table t WHERE t.integer_field < 4.9');
#given that integer_field is 5
版本: PHP 7.2.19 PostgreSQL 10.4
【问题讨论】:
-
整数不能包含小数。所有整数都是整数(所有自然数都是整数),但并非所有整数都是整数。
-
是的,但我可以查询“WHERE t.integer_field/2 > 9.5”
-
这可能与您在
execute()中传递变量的方式有关。我怀疑如果您将9.5括在引号/单引号中,它会起作用,但我对此并不完全确定,因为您将检查字符串是否为>。 -
execute所有值都被视为 PDO::PARAM_STR。尝试使用bindParam和PDO::PARAM_INT。 -
我会尝试根据php.net/manual/en/pdo.setattribute.php 将
PDO::ATTR_EMULATE_PREPARES设置为false,因为我认为您的错误是在SQL 有机会到达数据库并保留$stmt->bindParam(1, $param, \PDO::PARAM_INT);代码之前引起的
标签: php postgresql pdo