Should/Must 我在绑定一个空值时使用 PDO::PARAM_NULL?

Should/Must I use PDO::PARAM_NULL when binding a value that is null?

在使用 PDO 准备 SQL 查询时,should/must 我这样做

$query->bindValue('column', $value, is_null($value) ? PDO::PARAM_NULL : PDO::PARAM_STR);

或者我可以直接使用 PDO::PARAM_INTPDO::PARAM_STR,因为 PDO 会自己算出来? (在我看来真的,真的应该)


作为一个好奇的后续问题,如果我 不必 必须使用 PDO::PARAM_NULL,它究竟有什么用?

PDO 的想法是您可以使用 1 API 与不同的数据库进行通信,这意味着一个数据库处理一个值的方式可能与另一个不同。例如 MySQL 可以将整数类型列的值处理为整数和字符串:

INSERT INTO table (col_type_int) VALUES (1)
INSERT INTO table (col_type_int) VALUES ('1')

此查询可以在 MySQL 中以两种方式正确执行,但不同的数据库可能更具体。

所以 PDO::PARAM_TYPE 只是向查询添加了另一个严格级别,以确保针对不同的数据库类型正确转换查询。当前 source code 中使用的唯一值是 PDO_PARAM_STRPDO_PARAM_INTPDO_PARAM_BOOL。其他的只是转换成字符串。

通过将 PDO::PARAM_NULL 添加到查询仅确保如果您要使用不同的驱动程序(可能甚至还不存在)以不同的方式处理它们,您不需要更改代码,也许只有查询。

理论上 PDO 应该承认

$value = NULL;
$query->bindValue('column', $value, PDO::PARAM_STR);

并将 NULL(不是字符串 'NULL',也不是 '')存储到语句中。特别是,它应该能够生成

UPDATE ... SET `column` = NULL;

来自上面的绑定。

在这种情况下,您的代码是 'overkill'。

不,您不需要使用 PDO::PARAM_NULL。如果您将 NULL 与任何类型绑定,则 PDO 将在内部使用 NULL。该值不会转换为字符串、数字或任何其他类型。 NULL 将保持为 NULL。

当你将类型设置为PDO::PARAM_NULL时,相当于将值设置为NULL。有人可能会争辩说 PDO::PARAM_NULL 是无用的,因为将 NULL 与任何其他类型绑定时可以获得相同的结果。

以下语句都将绑定文字 NULL 值。

$str = 'someString';
$stmt->bindParam(1, $str, PDO::PARAM_NULL); 

$str = null;
$stmt->bindParam(1, $str, PDO::PARAM_STR);

$stmt->bindValue(1, null);