在绑定之前如何转换 PDO::prepare 参数标记的决定性实体是什么?
例如,以下查询使用 PDO:prepare 发送到 MSSQL:
SELECT r.name, p.name, i.[grant] AS permGrant
FROM acl AS r
JOIN acl AS p ON p.type = 'p'
AND p.name = :permName
JOIN acl AS i ON i.type = 'i'
AND p.id = i.permissionInstanceRefID
AND r.id = i.referenceAclId
WHERE r.name = 'Anonymous'
AND r.type = 'r'
在 MSSQL 中准备时,SQL Profiler 日志将准备好的语句显示为:
declare @p1 int
set @p1=NULL
exec sp_prepare @p1 output,N'@P1 text',N'
SELECT r.name, p.name, i.[grant] AS permGrant
FROM acl AS r
JOIN acl AS p ON p.type = ''p''
AND p.name = @P1
JOIN acl AS i ON i.type = ''i''
AND p.id = i.permissionInstanceRefID
AND r.id = i.referenceAclId
WHERE r.name = ''Anonymous''
AND r.type = ''r''
',1
select @p1
在 MSSQL 数据库表中 p.type 被强制转换为 varchar(25) - 是什么决定了 @P1 参数被强制转换为文本(这当然与等号运算符不兼容?)
我已经通过在正在准备的查询中转换值来解决我的问题,但我觉得我不应该这样做。
感谢您的见解。