Я пытаюсь экспортировать некоторые данные из базы данных 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.