2012-06-22 3 views
7

Ich habe eine Tabelle, die ich mit verschiedenen Zeichen umgehen muss. Die Zeichen enthalten Ø, ® etc.Falscher String-Wert: ' xEF xBF xBD' für Spalte

Ich habe meine Tabelle auf UTF-8 als Standardsortierung eingestellt, alle Spalten verwenden Tabellenstandard, aber wenn ich versuche, diese Zeichen einzufügen, erhalte ich einen Fehler: Falscher Zeichenfolgenwert: '\ xEF \ xBF \ XBD‘für Spalte‚buyerName‘in Zeile 1

ist meine Verbindungszeichenfolge als

string mySqlConn = "server="+server+";user="+username+";database="+database+";port="+port+";password="+password+";charset=utf8;"; 

ich ratlos bin definiert, warum ich immer noch Fehler sehe. Habe ich irgendetwas mit dem .net Connector oder mit meinem MySQL Setup verpasst?

--Edit--

Meine (neu) C# Insert-Anweisung wie folgt aussieht:

MySqlCommand insert = new MySqlCommand("INSERT INTO fulfilled_Shipments_Data " + 
    "(amazonOrderId,merchantOrderId,shipmentId,shipmentItemId,"+ 
    "amazonOrderItemId,merchantOrderItemId,purchaseDate,"+ ... 

     VALUES (@amazonOrderId,@merchantOrderId,@shipmentId,@shipmentItemId,"+ 
     "@amazonOrderItemId,@merchantOrderItemId,@purchaseDate,"+ 
     "paymentsDate,shipmentDate,reportingDate,buyerEmail,buyerName,"+ ... 


     insert.Parameters.AddWithValue("@amazonorderId",lines[0]); 
     insert.Parameters.AddWithValue("@merchantOrderId",lines[1]); 
     insert.Parameters.AddWithValue("@shipmentId",lines[2]); 
     insert.Parameters.AddWithValue("@shipmentItemId",lines[3]); 
     insert.Parameters.AddWithValue("@amazonOrderItemId",lines[4]); 
     insert.Parameters.AddWithValue("@merchantOrderItemId",lines[5]); 
     insert.Parameters.AddWithValue("@purchaseDate",lines[6]); 
     insert.Parameters.AddWithValue("@paymentsDate",lines[7]); 

insert.ExecuteNonQuery(); 

Unter der Annahme, dass dies der richtige Weg ist parametrisierte Aussagen zu verwenden, ist es immer noch einen Fehler geben

"Incorrect string value: '\xEF\xBF\xBD' for column 'buyerName' at row 1" 

Irgendwelche anderen Ideen?

+1

Es kann hilfreich sein, wenn Sie den C# -Code posten, den Sie zum Einfügen in die Tabelle verwenden. –

+0

Diese drei Zeichen sehen * fast * aus wie die [UTF-8 Byte-Reihenfolge-Markierung (BOM)] (http://en.wikipedia.org/wiki/Byte_Order_Mark). – stakx

+0

Insert-Anweisung hinzugefügt, unsicher, wie hilfreich es ist, weil es eine Standard-Insert-Anweisung ist, aber wenn es hilft ... –

Antwort

14

\xEF\xBF\xBD ist die UTF-8-Kodierung für das Unicode-Zeichen U+FFFD. Dies ist ein Sonderzeichen, das auch als "Ersatzzeichen" bezeichnet wird. Ein Zitat von the wikipedia page about the special unicode characters:

The replacement character � (often a black diamond with a white question mark) is a symbol found in the Unicode standard at codepoint U+FFFD in the Specials table. It is used to indicate problems when a system is not able to decode a stream of data to a correct symbol. It is most commonly seen when a font does not contain a character, but is also seen when the data is invalid and does not match any character:

So sieht es aus wie Ihre Datenquelle beschädigte Daten enthält. Es ist auch möglich, dass Sie versuchen, die Daten mit der falschen Codierung zu lesen. Woher kommen die Linien?

Wenn Sie die Daten nicht beheben können, und Ihre Eingabe zwar ungültige Zeichen enthält, können Sie nur die Ersatzzeichen entfernen:

lines[n] = lines[n].Replace("\xFFFD", ""); 
+0

Informationen kommen von Amazon - so kann ich leider nicht ändern - sieht aus wie Ersatz es ist. Nochmals vielen Dank Elian - sobald ich das bestätigt habe, werde ich die Frage als beantwortet markieren. –

+0

Es hat getan, was ich tun musste (Hinzufügen von Informationen zu meiner Datenbank für den Verbrauch), obwohl ich bemerkte, dass es einige irreführende Informationen verursacht, zum Beispiel, wenn ich den ø lösche, wird ein Nachname des Kunden falsch geschrieben. Es scheint, dass es einen besseren Weg geben sollte. Aber danke für die Bereitstellung einer Lösung, die für jetzt Elian funktionieren wird. –

+0

Findend das machte meinen Tag :) danke – ehacinom

5

NIE, EVER, EVER jemals eine SQL-Anweisung wie diese erstellen. Das ist offen für SQL-Injection.

Ich füge das als Antwort hinzu, da dies ein so grundlegender Fehler ist, dass Sie wahrscheinlich einen Großteil Ihres Programms neu schreiben müssen.

Das ist nicht, wie Sie Parameter zu einer SQL-Anweisung liefern und es ist niemandem wert, Ihre Frage zu beantworten, da Sie parametrisierte Abfragen verwenden sollten, die wahrscheinlich auch Ihr Problem beheben.

+0

Ok -.. irgendwelche Vorschläge auf Ressourcen zu nutzen, um zu zeigen, parametrisierte Abfragen –

+0

Ein bisschen es melodramatisch von mir, sorry Eliáns Beispiel ist gut – mattmanser

+0

keine Sorgen Dad;) –

2

Mattmanser hat Recht, schreiben Sie nie eine SQL-Abfrage, indem Sie die Parameter direkt in der Abfrage verketten. Ein Beispiel für eine parametrisierte Abfrage ist:

string lastname = "Doe"; 
double height = 6.1; 
DateTime date = new DateTime(1978,4,18); 

var connection = new MySqlConnection(connStr); 

try 
{ 
    connection.Open(); 

    var command = new MySqlCommand(
     "SELECT * FROM tblPerson WHERE LastName = @Name AND Height > @Height AND BirthDate < @BirthDate", connection); 

    command.Parameters.AddWithValue("@Name", lastname); 
    command.Parameters.AddWithValue("@Height", height); 
    command.Parameters.AddWithValue("@Name", birthDate); 

    MySqlDataReader reader = command.ExecuteReader(); 
    ... 
} 
finally 
{ 
    connection.Close(); 
} 
+0

Danke für das Beispiel - Frage aber - was bei der Verwendung von Parametern SQL-Injektion verhindert, wenn die gerade substituiert auch, wie würde ich?!? mit Hilfe von Parametern zu tun, einen Einsatz? –

+1

Sie sind nicht nur ersetzt. Die 'AddWithValue()' Methode ist stark typisierte und überlastet. In diesem Fall 'Name 'ist eine Zeichenkette, aber es könnte auch eine' int', 'bool' oder' DateTime' sein. Dieser Code stellt sicher, dass die Zeichenfolgen maskiert sind und dass alle anderen Typen korrekt formatiert sind. Es wird daher SQL-Injection-Schwachstellen verhindern. –

+0

Danke, daran zu arbeiten jetzt - keine Notwendigkeit, ein Beispiel eines Einsatzes zu geben, fand ich einen arbeite ich aus der. –

-1

Für diejenigen, die ein ähnliches Problem mit PHP haben, versuchen Sie die Funktion utf8_encode($string) . Es funktioniert einfach!

Verwandte Themen