2012-06-29 43 views
12

現在、私は奇妙なエラーが発生しています。PDOを使用してMSSQLにバイナリデータを挿入する方法

セットアップ:localdb と MSSQL Server 2012のExpressのターゲットテーブルの照合順序は次のとおりです。順序SQL_Latin1_General_CP1_CI_AS

PHP 5.3.9

のZend Serverの5.6 MCRYPT_RIJNDAEL_256とmcryptのとMCRYPT_MODE_ECBの崇高テキスト2デフォルトエンコーディング(私はUTF8 BOMを読んでいます)

私はMSSQLサーバ用の公式のMSアダプタでPDOを使用しています。 1つのこと以外はすべて正常に動作します。 パスワードのために管理者テーブルに行を書き込むことができません。

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)" 

は私が準備されたステートメントと私のSQL文を実行するための追加のないオプションを持つbindParam関数を使用します。

誰かがアイデアを持っている場合は、解決方法を私に教えてください。何かの助けをいただければ幸いです!

+2

ms sqlについてはわかりませんが、バイナリ列を宣言する方法、つまりエンコードまたは照合が必要です。 –

+0

@Jack、コメントありがとう。その後、私はbinaryとvarbinaryの列を試しましたが、それらはどちらも動作しません。 – Richard

+0

さて、おそらくPDOのバイナリとしてパラメータをバインドする方法はありますか? –

答えて

2

これらの少数の無人の文字を処理するには、照合順序をutf8_unicode_ciのように変更する必要があります。

また、あなたはこのような何か試してみてください。でも、私の例の最後の行の代わりに、おそらく、このチェックを行う(エラー/バグが起こって始まる、これはある)のタイプをダブルチェックするために

$db = new PDO('foo', 'bar', 'blo'); 
$stmt = $db->prepare("select foo, bar from table where id=?"); 
$stmt->execute(array($_GET['id'])); 
$stmt->bindColumn(1, $type, PDO::PARAM_STR, 256); 
$stmt->bindColumn(2, $lob, PDO::PARAM_LOB); 
$stmt->fetch(PDO::FETCH_BOUND); 
header("Content-Type: $type"); 
fpassthru($lob); 

を上記:

if (is_string($lob)) echo $lob; 
else fpassthru($lob); 
関連する問題