支持什么类型的占位符(如果有)取决于司机 https://metacpan.org/pod/distribution/DBI/DBI.pm#Placeholders-and-Bind-Values:
占位符和绑定值
某些驱动程序支持占位符和绑定值。
[...]
有些驱动程序还允许使用占位符,例如:name and :N (e.g., :1, :2等)此外?,但它们的使用不可移植。
但你很幸运,PostgreSQL 驱动程序 http://search.cpan.org/dist/DBD-Pg/Pg.pm#Placeholders支持命名或编号参数:
DBD::Pg 中可以使用三种类型的占位符。第一种是“问号”类型,其中每个占位符都由单个问号字符表示。
[...]
该方法的第二种类型的占位符是“美元符号数字”。
[...]
最终占位符类型是“命名参数”,格式为“:foo”。
And the SQLite驱动程序 http://search.cpan.org/dist/DBD-SQLite/lib/DBD/SQLite.pm#Placeholders也支持他们:
SQLite 支持多种占位符表达式,包括 ?和:AAAA。
缺点是你最终会使用bind_param
很多带有命名参数,因此您将无法使用诸如selectcol_arrayref
and $sth->execute(1,2,3)
(Note:如果有人知道如何使用命名占位符execute
我很感激评论中的一些指示,我从来没有弄清楚如何做到这一点)。但是,您可以使用各种形式的数字占位符(例如select c from t where x = $1
对于 PostgreSQL 或select c from t where x = ?1
对于 SQLite)。
另请注意,PostgreSQL 使用冒号表示数组切片,使用问号表示某些运算符,因此有时标准?占位符和:name命名占位符可能会导致问题。我从来没有遇到过任何问题?但我从来没有用过几何算子 http://www.postgresql.org/docs/current/interactive/functions-geometry.html任何一个;我怀疑合理使用空格可以避免任何问题?。如果您不使用 PostgreSQL 数组,那么您可能不必担心数组切片 http://www.postgresql.org/docs/current/interactive/arrays.html#ARRAYS-ACCESSING与你的战斗:name
命名占位符。
执行摘要: 不能使用命名占位符selectcol_arrayref
或类似的方法@bind_params
。但是,对于 SQLite 和 Postgresql,您可以使用编号占位符 ($1
, $2
, ... 对于 Postgresql 或?1
, ?2
,...对于 SQLite)以及适用的方法@bind_params
或者您可以使用命名占位符(:name
对于 PostgreSQL 和 SQLite)如果您愿意使用更长的prepare
/bind_param
/execute
/fetch
方法的顺序,如果在查询中使用 PostgreSQL 数组,则必须小心。