Я пытаюсь экспортировать некоторые данные из базы данных MySQL, но странные и замечательные вещи происходят с unicode в этой таблице.
Я сосредоточусь на одном персонаже, левом smartquote: "
Когда я использую SELECT с консоли, он печатается без проблем:
mysql> SELECT text FROM posts;
+-------+
| text |
+-------+
| "foo" |
+-------+
Это означает, что данные отправляются на мой терминал как utf-8 [0] (что правильно).
Однако, когда я использую SELECT * FROM posts INTO OUTFILE '/tmp/x.csv' …;, выходной файл неправильно закодирован:
$ cat /tmp/x.csv
“fooâ€
В частности, " закодирован с семью (7!) байтами: \xc3\xa2\xe2\x82\xac\xc5\x93.
Что такое кодировка? Или как я могу сказать MySQL использовать менее необоснованную кодировку?
Кроме того, некоторые разные факты:
-
SELECT @@character_set_databaseвозвращаетlatin1 - Столбец
textимеет значениеVARCHAR(42):mysql> DESCRIBE posts; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | text | varchar(42) | NO | MUL | | | +-------+-------------+------+-----+---------+-------+ -
", закодированный как utf-8, дает\xe2\x80\x9c -
\xe2\x80\x9cдекодируется какlatin1, а затем перекодируется какutf-8дает\xc3\xa2\xc2\x80\xc2\x9c(6 байтов). - Другая точка данных:
…(utf-8:\xe2\x80\xa6) закодирована до\xc3\xa2\xe2\x82\xac\xc2\xa6
[0]: поскольку интеллектуальные кавычки не включены ни в одну 8-битную кодировку, а мой терминал правильно отображает символы utf-8.