Я пытаюсь экспортировать некоторые данные из базы данных MySQL, но с юникодом в этой таблице происходят странные и удивительные вещи.
Я остановлюсь на одном символе, левой умной цитате: «
Когда я использую 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.