2009-06-02 4 views
13

Ich habe eine alte MySQL-Datenbank mit Codierung auf UTF-8 festgelegt. Ich benutze das Ado.Net Entity-Framework, um eine Verbindung herzustellen.MySQL C# Text Encoding Probleme

Die Zeichenfolge, die ich davon abrufe, haben seltsame Zeichen, wenn ähnliche Zeichen erwartet werden.

Zum Beispiel: "ë" ist "Ã".

Ich dachte, ich könnte das richtig machen, indem ich von UTF8 zu UTF16 konvertiere.

return Encoding.Unicode.GetString(    
      Encoding.Convert(
      Encoding.UTF8, 
      Encoding.Unicode, 
      Encoding.UTF8.GetBytes(utf8))); 
    } 

Das ändert jedoch nichts.

Wie kann ich die Daten aus dieser Datenbank in richtiger Form erhalten?

+0

Das Problem verwenden ist mehr als wahrscheinlich in dem MySQL-Speicher. Wie sieht dein Tisch aus? – Craig

Antwort

3

Auch wenn die Datenbank festgelegt ist Sie auf UTF8 müssen die folgenden Dinge tun Unicode-Felder zu bekommen richtig arbeiten:

  1. Stellen Sie sicher, Sie verwenden ein Unicode-Feldtyp wie NVARCHAR oder TEXT charset utf8
  2. Immer wenn Sie etwas in das Feld einfügen, müssen Sie ihm das N-Zeichen voranstellen, um Unicode-Daten anzugeben, wie in den folgenden Beispielen gezeigt
  3. Wenn Sie basierend auf Unicode-Daten auswählen, verwenden Sie das Präfix N wieder

MySqlCommand cmd = new MySqlCommand("INSERT INTO EXAMPLE (someField) VALUES (N'Unicode Data')"); 

MySqlCommand cmd2 = new MySqlCommand("SELECT * FROM EXAMPLE WHERE someField=N'Unicode Data'"); 

Wenn die Datenbank nicht ordnungsgemäß konfiguriert wurde oder die Daten wurden ohne die Verwendung des N-Präfix eingefügt wird es nicht möglich sein, aus die richtigen Daten zu bekommen, da es in der niedergeschlagenen gewesen sein wird Latin 1/ASCII-Zeichensatz

+0

Ich befürchte, dass dieses Problem der Abwärtsbewegung der Fall ist. Die Tabellen sind in UTF8, aber die Felder sind nur VARCHAR. Gibt es keine Möglichkeit, es zu utf8 oder was auch immer kodieren, um die Daten zurück zu bekommen? – Peter

+0

Seltsamerweise scheint die Ruby on Rails App, die die Datenbank verwendet, keine Probleme zu haben, die Daten korrekt zu bekommen. – Peter

1

Versuchen Sie, die Codierung durch "set names utf8" -Abfrage festzulegen. Sie können diesen Parameter auch in mysql config einstellen.

1

Wie andere gesagt haben, könnte dies ein Db-Problem sein, aber es könnte auch durch eine alte Version des .net Mysql-Connectors verursacht werden.

Was ich eigentlich sagen wollte, war die utf8 zu utf16 Konvertierung. Die Zeichenkette, die Sie zu konvertieren versuchen, ist tatsächlich Unicode-codiert, so dass Ihre "Ã" Zeichen tatsächlich 4 Bytes (oder mehr) belegen und nicht mehr zum Zeitpunkt Ihrer Konvertierung eine falsche Darstellung des "ë" Zeichens sind. Das ist der Grund, warum deine Konvertierung nichts bewirkt. Wenn Sie eine Konvertierung wie diese machen möchten, müsste ich Ihre utf8-Zeichenfolge als ein altes 1-Byte-Byte pro Zeichenkette kodieren, indem Sie eine Codepage verwenden, wo die Byte-Werte von und die utf8 Byte-Sequenz von und darstellen Behandeln Sie dann die Bytes dieser neuen Zeichenfolge als eine utf8-Zeichenfolge. Lustige Sachen.

32

Es gibt zwei Dinge, die Sie benötigen UTF-8 in der ADO.NET Entity Rahmen der Arbeit zu tun (oder allgemein mit dem MySQL .NET Connector) zu unterstützen:

  1. Stellen Sie sicher, dass die Zusammenstellung Ihres Datenbank der Tabelle ist eine UTF-8-Sortierung (dh utf8_general_ci oder eine ihrer Beziehungen)
  2. Fügen Sie Charset=utf8; zu Ihrer Verbindungszeichenfolge hinzu.

    "Server=localhost;Database=test;Uid=test;Pwd=test;Charset=utf8;" 
    

Ich bin nicht sicher, aber die Codierung sein kann Groß- und Kleinschreibung; Ich habe festgestellt, dass nicht für mich funktioniert hat.

+3

Vielen Dank .. Ich hatte dasselbe Problem .. es hat für mich funktioniert .... – Sameer

+0

Ich habe schon Füge diese Information zu connectionstring hinzu, kann aber nicht funktionieren. – sendreams

+0

sendreams

0

danke der Mund einer Kuh, Ihre Lösung funktioniert, aber immer noch müssen wir Zeichen konvertieren. Ich denke, das ist Ihr Problem :) und für die Umwandlung von Zeichen können Sie diesen Code

System.Text.Encoding utf_8 = System.Text.Encoding.UTF8; 

string s = "unicode"; 

//string to utf 
byte[] utf = System.Text.Encoding.UTF8.GetBytes(s); 

//utf to string 
string s2= System.Text.Encoding.UTF8.GetString(utf);