MySQL: Zeichencodierung, die von SELECT INTO verwendet wird?
Ich versuche zu exportieren, einige Daten aus einer MySQL-Datenbank, aber seltsamen und wunderbaren Dinge, die passiert sind in unicode in die Tabelle.
Werde ich den Fokus auf einen Charakter, der linken smartquote: “
Wenn ich SELECT
von der Konsole, es wird gedruckt, ohne Frage:
mysql> SELECT text FROM posts;
+-------+
| text |
+-------+
| “foo” |
+-------+
Das bedeutet, die Daten werden an meinem terminal als utf-8[0] (das ist korrekt).
Jedoch, wenn ich SELECT * FROM posts INTO OUTFILE '/tmp/x.csv' …;
die Ausgabe-Datei ist nicht richtig codiert:
$ cat /tmp/x.csv
“fooâ€
Insbesondere die “
kodiert ist, mit sieben (7!) bytes: \xc3\xa2\xe2\x82\xac\xc5\x93
.
Welche Kodierung ist das? Oder wie könnte ich sagen, MySQL auf ein weniger unvernünftig Codierung?
Auch einige verschiedene Fakten:
SELECT @@character_set_database
zurücklatin1
- Die
text
Spalte ist einVARCHAR(42)
:
mysql> DESCRIBE posts; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | text | varchar(42) | NO | MUL | | | +-------+-------------+------+-----+---------+-------+
“
als utf-8 kodiert Erträge\xe2\x80\x9c
\xe2\x80\x9c
entschlüsseltlatin1
dann neu codiertutf-8
Erträge\xc3\xa2\xc2\x80\xc2\x9c
(6 bytes).- Ein weiterer Datenpunkt:
…
(utf-8:\xe2\x80\xa6
) kodiert\xc3\xa2\xe2\x82\xac\xc2\xa6
[0]: wie intelligente Anführungszeichen nicht enthalten sind in einem 8-bit-Codierung, und mein terminal korrekt rendert utf-8-Zeichen.
SELECT
, weil ich wollte, um filter-und join die Daten ein wenig, bevor Sie exportieren. Ich könnte wahrscheinlich Weg, ohne, dass, obwohl... Da einige Daten wäre besser als ganz kaputt Daten. InformationsquelleAutor der Frage David Wolever | 2012-03-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Viele Programme/Normen (einschließlich MySQL) davon aus, dass "latin1" bedeutet "cp1252", so die 0x80 byte interpretiert wird, als ein Euro-symbol, die ist, wo
\xe2\x82\xac
bit (U+20AC) kommt in die Mitte.Wenn ich versuche, es funktioniert (aber Hinweis, wie ich Daten in, und die Variablen, die auf dem db-server):
Und von der shell aus:
Hoffentlich gibt es eine nützliche Leckerbissen...
InformationsquelleAutor der Antwort taavi
Neueren MySQL-Versionen haben eine option, um den Zeichensatz in das outfile-Klausel:
InformationsquelleAutor der Antwort mvd
Um speziell auf deine Frage "Was ist das?", Sie haben die Antwort selbst:
Dass ist die Art, wie MySQL speichert
utf8
codierte Daten intern. Es ist eine furchtbar ineffiziente Variante des Unicode-Speicherung, offenbar mit einem vollen drei Byte für die meisten Zeichen, und nicht Unterstützung von vier-byte-UTF-8-Sequenzen.Als für wie es zu konvertieren, um echte UTF-8 verwenden
INTO OUTFILE
... ich weiß nicht. Mit anderenmysqldump
Methoden wird es aber tun.InformationsquelleAutor der Antwort deceze
Wie Sie sehen können meine MySQL-Datenbank verwenden
latin1
und das system istutf-8
.Jedes mal, wenn ich habe versucht, die Tabelle zu exportieren, ich habe seltsame-kodierten CSV-Datei.
Also, ich Stell:
als in meinem export-Skript.
Dann habe ich Reine UTF-8-Ausgabe.
InformationsquelleAutor der Antwort paczor
Habe ich herausgefunden, dass dies gut funktioniert.
InformationsquelleAutor der Antwort dhruvbird
Versuchen
SET CHARACTER SET <blah>
bevor Ihr wählen,<blah>=utf8
oderlatin1
etc...Siehe: http://dev.mysql.com/doc/refman/5.6/en/charset-connection.html
Oder
SET NAMES utf8;
funktionieren könnte...InformationsquelleAutor der Antwort Hardeep
Können Sie ausführen von MySQL-Abfragen unter Verwendung der CLI-Tools (ich glaube sogar mit einem Ausgabe-format, so dass es druckt CSV) und Umleitung in eine Datei. Tun sollte charset-Konvertierung und immer noch geben Ihnen Zugang zu tun, joins, etc.
InformationsquelleAutor der Antwort singpolyma
Müssen Sie Problem
charset utf8
an der MySQL-Eingabeaufforderung vor dem ausführen desSELECT
. Dies sagt dem server, was zur Ausgabe der Ergebnisse als.InformationsquelleAutor der Antwort Burhan Khalid