2012-06-29 21 views
12

einfügen Ich habe derzeit einen seltsamen Fehler.Wie binäre Daten in MSSQL mit PDO

Das Setup: MSSQL Server 2012 Express mit einem localdb Die Zieltabelle Sortierungs ist: SQL_Latin1_General_CP1_CI_AS

PHP 5.3.9 auf einem Zend Server 5.6 MCrypt mit MCRYPT_RIJNDAEL_256 und MCRYPT_MODE_ECB

Sublime Text 2 default Kodierung (Ich lese es ist UTF8 BOM)

Ich verwende PDO mit dem offiziellen MS-Adapter für den MSSQL-Server. Alles funktioniert gut abgesehen von einer Sache: Ich kann keine Zeile in meiner Administrator-Tabelle wegen des Passworts schreiben.

Werfen wir einen Blick auf mein verschlüsseltes Passwort haben:

y"ûƒ^äjw¾bðúl5êù-Ö=W¿Š±¬GP¥Œy÷&ø 

Dies ist die PDO Trace:

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 

Als ich meine MSSQL Management Center verwenden kann ich meine Reihe mit der exakt gleichen SQL einfügen Abfrage. Die Säule Einrichtung ist in Ordnung, ich nehme an:

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

ich vorbereitete Anweisungen und die bindParam Funktion keine zusätzliche Optionen zu meinen SQL-Anweisungen ausführen.

Wenn jemand eine Idee hat, wie man das löst, lass es mich wissen. Jede Art von Hilfe wird geschätzt!

+2

Nicht sicher über ms sql, aber es muss eine Möglichkeit geben, eine binäre Spalte zu deklarieren, dh keine Codierung oder Sortierung. –

+0

@Jack, Danke für den Kommentar. Danach habe ich die Binär- und Varbinary-Spalten ausprobiert, aber auch diese funktionieren nicht. – Richard

+0

Okay, gibt es eine Möglichkeit, den Parameter möglicherweise als binär in PDO zu binden? –

Antwort

2

Sie sollten Ihre Kollatierung in etwas wie utf8_unicode_ci ändern, um diese wenigen unbeaufsichtigten Zeichen zu behandeln.

Auch sollten Sie so etwas wie dies versuchen:

$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); 

Um die doppelte Art überprüfen (dies ist, wo der Fehler/Bug beginnt geschieht) tun, um diese zu überprüfen, vielleicht sogar anstelle der letzten Zeile von meinem Beispiel oben: