【发布时间】:2012-07-01 01:24:41
【问题描述】:
我目前遇到一个奇怪的错误。
设置: 带有 localdb 的 MSSQL Server 2012 Express 目标表排序规则为:SQL_Latin1_General_CP1_CI_AS
Zend 服务器 5.6 上的 PHP 5.3.9 带有 MCRYPT_RIJNDAEL_256 和 MCRYPT_MODE_ECB 的 MCrypt
Sublime Text 2 默认编码(我读的是 UTF8 BOM)
我将 PDO 与 MSSQL 服务器的官方 MS 适配器一起使用。除了一件事,一切都很好: 由于密码,我无法在管理员表中写入一行。
让我们看看我的加密密码:
y"ûƒ^äjw¾bðúl5êù-Ö=W¿Š±¬GP¥Œy÷&ø
这是 PDO 跟踪:
Array
(
[0] => IMSSP
[1] => -7
[2] => An error occurred translating string for input param 3 to UCS-2: No mapping for the Unicode character exists in the target multi-byte code page.
)
SQL: [120] INSERT INTO administrator ( [username], [email], [password], [section] ) VALUES(:username, :email, :password, :section)
Params: 4
Key: Name: [9] :username
paramno=0
name=[9] ":username"
is_param=1
param_type=2
Key: Name: [6] :email
paramno=1
name=[6] ":email"
is_param=1
param_type=2
Key: Name: [9] :password
paramno=2
name=[9] ":password"
is_param=1
param_type=2
Key: Name: [8] :section
paramno=3
name=[8] ":section"
is_param=1
param_type=2
当我使用我的 MSSQL 管理中心时,我可以使用完全相同的 SQL 查询插入我的行。 我想列设置很好:
["id"]=>
string(3) "int"
["username"]=>
string(12) "nvarchar(45)"
["email"]=>
string(12) "nvarchar(45)"
["password"]=>
string(12) "varbinary(45)"
["section"]=>
string(11) "nvarchar(7)"
["country_code"]=>
string(11) "nvarchar(2)"
我使用准备好的语句和 bindParam 函数来执行我的 SQL 语句,没有额外的选项。
如果有人有想法,请告诉我如何解决。感谢您提供任何帮助!
【问题讨论】:
-
不确定ms sql,但必须有声明二进制列的方法,即不编码或排序。
-
@Jack,感谢您的评论。之后我尝试了 binary 和 varbinary 列,但它们也不起作用。
-
在这种情况下,除了使用 base64 编码之外,我已经没有想法了 :) 25% 开销
-
只是出于兴趣,我希望您有充分的理由加密密码而不是散列密码。此外,您可能想改写您的问题来询问“如何使用 PDO 将二进制数据插入 MSSQL”,它可能会吸引更多/正确的关注。
-
你试过bindParam(2, $password, PDO::PARAM_LOB, 0, PDO::SQLSRV_ENCODING_BINARY);
标签: php sql sql-server pdo