2012-06-22 14 views
7

Posiadam tabelę potrzebną do obsługi różnych znaków. Znaki obejmują Ø, ® itd.Niepoprawna wartość ciągu: ' xEF xBF xBD' dla kolumny

Ustawiłem moją tabelę na UTF-8 jako domyślne sortowanie, wszystkie kolumny używają domyślnej tabeli, jednak gdy próbuję wstawić te znaki, pojawia się błąd: Niepoprawna wartość ciągu znaków: '\ XEF \ xBF \ XBD”w kolumnie«BUYERNAME»w wierszu 1

Moje ciąg połączenia jest definiowana jako

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

Jestem w rozterce, dlaczego ja wciąż widząc błędy. Czy przeoczyłem coś ze złączem .net lub z moją konfiguracją MySQL?

--Edit--

My (nowa) oświadczenie C# wkładka wygląda następująco:

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

Zakładając, że jest to właściwy sposób na wykorzystanie sparametryzowanych sprawozdań, to wciąż daje błąd

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

Jakieś inne pomysły?

+1

Pomocne może być opublikowanie kodu C#, który zostanie wstawiony do tabeli. –

+0

Te trzy znaki wyglądają * prawie * tak jak znak kolejności bajtów UTF-8 (BOM)] (http://en.wikipedia.org/wiki/Byte_Order_Mark). – stakx

+0

Dodano instrukcję wstawiania, nie wiem, na ile jest to pomocne, ponieważ jest to standardowa instrukcja wstawiania, ale jeśli pomaga ... –

Odpowiedz

14

\xEF\xBF\xBD jest kodowanie UTF-8 dla Unicode U+FFFD. Jest to postać specjalna, znana również jako "postać zastępcza". Cytat z 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:

Wygląda więc na to źródło danych zawiera uszkodzone dane. Możliwe jest również, że próbujesz odczytać dane za pomocą niewłaściwego kodowania. Skąd pochodzą linie?

Jeśli nie można ustalić dane, a Twój wkład rzeczywiście zawiera nieprawidłowe znaki, można po prostu usunąć znaki zamienne:

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

Informacje pochodzą z Amazon - więc niestety nie mogę tego zmienić - wygląda na to, że jest to zamiennik. Jeszcze raz dziękuję Elian - po potwierdzeniu tych prac zaznaczę pytanie jako odpowiedź. –

+0

Zrobiłem to, co było mi potrzebne (dodałem informacje do mojej bazy danych do konsumpcji), chociaż zauważyłem, że spowoduje to wprowadzanie w błąd, na przykład, gdy usuniemy ø, nazwisko klienta jest napisane niepoprawnie. Wygląda na to, że powinien istnieć lepszy sposób. Ale dzięki za dostarczenie rozwiązania, które będzie działać na razie, Elian. –

+0

Znalezienie tego dokonało mojego dnia :) dzięki – ehacinom

5

NIGDY, NIGDY, KIEDYKOLWIEK nie twórz instrukcji SQL w ten sposób. To jest szeroko otwarte na iniekcję SQL.

Dodaję to jako odpowiedź, ponieważ jest to tak podstawowy błąd, że prawdopodobnie będziesz musiał przepisać znaczną część swojego programu.

To nie jest sposób dostarczania parametrów do instrukcji SQL i nie warto nikomu odpowiadać na twoje pytanie, ponieważ powinieneś używać sparametryzowanych zapytań, które prawdopodobnie również rozwiążą Twój problem.

+0

Ok - wszelkie sugestie dotyczące zasobów do użycia, aby pokazać Paradoksalnie spytane zapytania? –

+0

Trochę melodramatycznie tam ode mnie, przykro mi! Przykład Eliana jest dobry – mattmanser

+0

bez zmartwień Tato;) –

2

Mattmanser ma rację, nigdy nie pisz kwerendy sql przez konkatenację parametrów bezpośrednio w kwerendzie. Przykład zapytania parametryzowaną jest:

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

Dzięki za przykład - pytanie jednak - co zapobiega iniekcji SQL przy użyciu parametrów, jeśli są po prostu zastąpione? zrobić insert przy użyciu parametrów? –

+1

Nie są one po prostu zastąpione.Metoda 'AddWithValue()' jest silna typed i przeciążony. W tym przypadku 'name 'jest łańcuchem, ale może to być również' int', 'bool' lub' DateTime'. Ten kod sprawi, że łańcuchy znaków zostaną zmienione, a wszystkie pozostałe typy będą poprawnie sformatowane. Zapobiegnie to zatem lukom SQL injection. –

+0

Dzięki, pracując nad tym teraz - nie trzeba podawać przykładu wkładki, znalazłem jedną, z której pracuję. –

-1

Dla tych, którzy mają podobny problem z wykorzystaniem PHP, wypróbuj funkcję utf8_encode($string) . Po prostu działa!

Powiązane problemy