Когда я пытался вставить правые двойные кавычки (») с помощью python MySQLdb, он выдает UnicodeEncodeError: 'latin-1' codec can't encode character u'\u201d' in position 0: ordinal not in range(256)
. python MySQLdb по умолчанию использует кодек latin-1, а из файла index.xml в /usr/share/mysql/charsets/
он описан как cp1252 West European. Следовательно, я думаю, что latin1 также будет охватывать символы cp1252. Но latin1 не будет охватывать символы cp1252, если они это сделают, я не получу ошибку.
Правые двойные кавычки находятся в кодировке cp1252, но не в кодировке ISO 8859-1 (или latin1).
В cp1252.xml
нет файла /usr/share/mysql/charsets/
. Почему в python MySQLdb отсутствует кодировка cp1252?
Или latin1
такой же, как cp1252
, как они описаны в index.xml
.
Возможный дубликат Python и MySql: Юникод и кодирование
@Tomalak По умолчанию используется код latin1. Моя ошибка была UnicodeEncodeError: 'latin-1' codec can't encode character
@Tomalak Это не дубликат. Я уже сказал, что не хочу использовать utf8 в качестве кодировки. Можно ли установить кодировку cp1252?
Прочтите мой первый комментарий еще раз.
@Tomalak Если я не указал кодировку, какая будет кодировка, выбранная для кодирования?
@Tomalak Почему у меня ошибка UnicodeEncodeError: 'latin-1' codec can't encode character
? Я не настраивал его для кодека latin1, но ошибка говорит о том, что MySQLdb использует кодек latin1
Вам действительно нужен cp1252, а не utf-8? Настоятельно рекомендую использовать utf-8.
Что вам нужно:
charset = "utf8mb4"
в MySQLdb.connect()
.Вы можете создать базу данных с помощью utf-8 с помощью CREATE DATABASE <your db name> DEFAULT CHARACTER SET utf8mb4
.
Если у вас уже есть база данных, вы можете изменить набор символов по умолчанию с помощью ALTER DATABASE <your db name> CHARACTER SET utf8mb4
. Но вам также необходимо изменить весь набор символов для существующих таблиц в базе данных.
Да все в порядке. А как насчет cp1252? Доступно в MySQLdb?
Нет. MySQL и MySQLdb его не поддерживают. latin1 поддерживается, но плохо протестирован.
Все кодировки, кроме ascii и utf-8, являются устаревшими. Вы должны использовать utf-8, если нет особой причины. Я (сопровождающий PyMySQL, mysqlclient-python (он же MySQLdb) и go-sql-driver / mysql) не тестирую кодировки, отличные от utf-8.
MySQLdb не поддерживает его, но MySQL поддерживает кодировку cp1252. Однако он называется latin1. Вы можете сослаться сюда dev.mysql.com/doc/refman/8.0/en/charset-we-sets.html
Да, я уже сказал, что "latin1 поддерживается". cp1252 - это кодировка, специфичная для Windows. Он очень похож на ISO-8859-1, но не идентичен. См. i18nqa.com/debug/table-iso8859-1-vs-windows-1252.html Вот почему я сказал, что cp1252 не поддерживается, но поддерживается latin1.
Но в mysql latin-1 совпадает с кодировкой cp1252. Но в MySQLdb это фактическая кодировка latin-1. Можете ли вы включить этот пункт в свой ответ? Я приму это после
Что ты имеешь в виду? Вы имеете в виду, что latin-1 в MySQL на самом деле cp1252, а в MySQL нет настоящего latin-1?
да, пожалуйста, посмотрите параграф с официальной страницы mysql latin1 is the default character set. MySQL's latin1 is the same as the Windows cp1252 character set. This means it is the same as the official ISO 8859-1 or IANA (Internet Assigned Numbers Authority) latin1, except that IANA latin1 treats the code points between 0x80 and 0x9f as “undefined,” whereas cp1252, and therefore MySQL's latin1, assign characters for those positions. For example, 0x80 is the Euro sign.
Вы можете обратиться сюда dev.mysql.com/doc/refman/8.0/en/charset-we-sets.html
Спасибо. Теперь я понимаю, что вы сказали. Тогда правильный ответ: «MySQLdb не поддерживает cp1252, потому что разработчик не знал, что latin-1 в MySQL на самом деле cp1252».
Набор символов и кодировка действительно сложны. Я плохо разбираюсь даже в японской кодировке, хотя я японец. «Использовать только UTF-8» упрощает качество жизни разработчика в мире. Теперь я знаю, что latin-1 в MySQL на самом деле cp1252, но я настоятельно рекомендую использовать UTF-8, чтобы избежать таких проблем. Все участники этой беседы, кроме вас, не поняли ваш вопрос. Это явное свидетельство того, что всем следует использовать только ASCII или UTF-8, если они не любят неприятностей.
connect()
в базу данных. Ты просто ничего не настраивал.