Rails, MySQL, Unicode-Daten und Latin1-Tabellen - Wohin geht es von hier?

8

Ich bin mir bei den Einzelheiten nicht 100% ig sicher, also würde ich jemanden lieben, der mich auseinandernimmt, aber ich werde mit dem weitermachen, was ich denke, vor sich geht ...

Als ich meine Datenbank zum ersten Mal eingerichtet habe, habe ich die Standardzeichencodierung des Systems verwendet, ohne darüber nachzudenken, und es war latin1. Ich habe nie an i18n / l10n gedacht. Es ist mir einfach nicht eingefallen. Ich akzeptierte einfach die Vorgaben und ging damit.

Wie auch immer, ich verwende die Datenbank ausschließlich für eine Rails-App und wir haben jetzt mehrere GB Daten, 100.000 Zeilen und viele internationale Benutzer. Ich habe festgestellt, dass viele unserer ausländischen Benutzer Daten einfügen, die Unicode / Non-Latin1 zu sein scheint. Hier ist ein Beispiel:

  

Was ist mit verrücktem Unicode-Zeug? ☢ ☠ ☭

database.yml

Hier ist unsere Datenbank.yml Datei.

%Vor%

Wie Sie sehen, setzen wir unsere Zeichencodierung auf utf8. Alle unsere Tabellen haben jedoch einen Standardzeichensatz von latin1. Da bin ich mir sicher.

Update Nach genauer Betrachtung zeigt unsere Produktion database.yml keine Codierung an, während meine lokale Kopie utf8 spezifiziert hat. Dies verursachte Probleme, wenn ich die Produktionsdatenbank ausgeben und lokal importieren würde. Es scheint jetzt, dass der Import gut funktionierte, aber Rails hat es falsch gelesen.

mysql CLI-Tool

Wenn ich die Daten über das mysql CLI-Tool anschaue, werden alle Unicode-Zeichen korrekt angezeigt. Die Anweisung 'show create table' zeigt jedoch deutlich, dass es sich bei den Tabellen um den Standardzeichensatz latin1 handelt. Dies lässt mich glauben, dass MySQL irgendwie schlau genug ist, um nicht-lateinische Daten zu speichern.

HTTP-Header

Unser HTTP Content-Type-Header ist wie folgt auf utf-8 gesetzt:

%Vor%

Conversion-Versuche

Ich habe ein wenig damit gespielt, unsere Tabellen in utf-8-Kodierung zu konvertieren, alles ohne Erfolg. Hauptsächlich habe ich versucht, die Datenbank zu dumpen, iconv zu konvertieren und dann mit den Tabellen neu zu importieren, die auf utf-8 gesetzt sind. MySQL hatte keine Fehler, aber alle Unicode-Daten wurden verstümmelt.

Was ist zu tun?

Ich bin irgendwie fest, was zu tun ist (wenn überhaupt). Ich glaube fest daran, nicht zu reparieren, was nicht gebrochen ist, aber diese ganze Situation beunruhigt mich. Wir hatten nie Beschwerden von Nutzern, dass sie ihre Daten nicht speichern könnten, und alles scheint gut zu funktionieren. Ich möchte nur wissen, was gerade passiert, wer / was macht die Konvertierung (MySQL? Ruby? Rails? MySQL-Verbindung?), Und irgendwelche Tipps, wie Sie vorgehen.

    
Micah 03.10.2010, 14:12
quelle

2 Antworten

3

Höchstwahrscheinlich sind die in Ihren Tabellen gespeicherten Daten gültiges UTF-8, aber MySQL denkt, dass es sich um Latin-1 handelt (weil das der Datentyp ist, mit dem die Spalte deklariert wurde). Es gilt natürlich auch Latin-1, da nach AFAIK jede beliebige Bytefolge gültig ist Latin-1.

Was passiert, wenn Sie nach UTF-8 konvertieren, ist, dass MySQL gültige Latin-1-codierte Daten sieht und diese in das äquivalente gültige UTF-8 konvertiert. Das bedeutet, dass Sie Daten erhalten, die doppelt UTF-8-kodiert sind, weshalb sie nicht korrekt sind.

Um dies zu umgehen, konvertieren Sie die Spalte in eine binäre Zeichenfolge und von dort in UTF-8. MySQL konvertiert die Zeichenkette nicht, wenn Sie dies tun (weil Sie es über ein Format konvertieren, das nur sagt: "Behandle diese Zeichenkette als eine Folge von 0s und 1s").

%Vor%     
Hammerite 03.10.2010 14:28
quelle
0

Was für mich (und andere) funktionierte, war die Verwendung des mysql2 Adapters.

In deiner Gemfile :

gem "mysql2"

In config / database.yml :

adapter: mysql2

Und Sie sollten daran denken, Ihren Datenbank-Zeichensatz ebenfalls auf UTF-8 zu setzen, aber wie ich es verstehe, haben Sie das auch getan: -)

Hoffe das hilft?

    
Lasse Bunk 28.05.2012 19:01
quelle