占位符类型符号主要出现在两个扩展中,用法不同:
MySQLi:使用
bind_param()方法时,需要第一个参数传入类型格式字符串(如'issd'),每个字符代表一个参数的数据类型。PDO:使用
bindParam()/bindValue()时,通过常量(如PDO::PARAM_INT)指定类型,无需类型字符串。
下面分别详细说明。
一、MySQLi 的类型符号(最常用)
bind_param($types, &$var1, &$var2, ...) 中的 $types 字符串由以下字符组成,每个占位符 ? 必须对应一个类型符号:
符号 对应数据类型 说明 iint 整数类型(TINYINT, INT, BIGINT 等) ddouble / float 浮点数(DECIMAL, FLOAT, DOUBLE) sstring 字符串(CHAR, VARCHAR, TEXT, BLOB, DATE, DATETIME 等) bblob 二进制大对象(BLOB 字段),会以数据包形式发送
示例:
// 假设 SQL:INSERT INTO user (id, name, score, avatar) VALUES (?, ?, ?, ?)
// 对应类型:id=int, name=string, score=double, avatar=blob
$stmt->bind_param('isdb', $id, $name, $score, $avatar);
注意事项:
类型符号个数必须与
?占位符个数完全一致。即使字段为
DECIMAL(10,2),也应使用d(双精度浮点数),或s(转为字符串)以避免精度丢失。BLOB 类型用
b传输二进制数据(如文件内容),字符串数据也可用s插入到 BLOB 字段,但b更规范。
二、PDO 的类型常量(对比参考)
PDO 不使用类型字符串,而是在绑定参数时通过常量显式指定类型:
常量 说明 PDO::PARAM_INT整数 PDO::PARAM_STR字符串(默认) PDO::PARAM_BOOL布尔值 PDO::PARAM_NULLNULL 值 PDO::PARAM_LOB大对象(BLOB/CLOB)
示例:
$stmt->bindParam(':id', $id, PDO::PARAM_INT);
$stmt->bindParam(':content', $content, PDO::PARAM_LOB);
PDO 没有“类型字符串”的概念,但可通过 bindParam 第三个参数指定类型,或在 execute() 数组中不指定(全部按字符串处理)。
三、常见误区澄清
?占位符本身不带类型符号 类型符号只出现在 MySQLi 的bind_param()中,与 SQL 语句里的?无关。类型符号必须正确 如果类型不匹配(如用
'i'绑定字符串'abc'),MySQLi 会尝试转换,可能导致意想不到的结果或错误。DECIMAL 字段建议用
's'绑定 浮点数'd'可能产生精度丢失(如 0.1+0.2 问题),用字符串更安全。
总结速查表
扩展 类型指定方式 符号/常量 支持的数据类型 MySQLi bind_param($types, ...)i d s bint, float, string, blob PDO bindParam(..., PDO::PARAM_*)PARAM_INT PARAM_STR PARAM_LOB 等int, string, bool, null, blob
在编写 MySQLi 预处理语句时,请牢记:一个占位符一个类型符号,顺序必须匹配
