Как вставить символы cp1252 с помощью MySQLdb?

Когда я пытался вставить правые двойные кавычки (») с помощью 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 MySQLdb использует кодек latin-1" Это предположение неверно. Он будет использовать любую кодировку, которую вы сконфигурируете при вводе connect() в базу данных. Ты просто ничего не настраивал.
Tomalak 18.12.2018 09:28

Возможный дубликат Python и MySql: Юникод и кодирование

Tomalak 18.12.2018 09:28

@Tomalak По умолчанию используется код latin1. Моя ошибка была UnicodeEncodeError: 'latin-1' codec can't encode character

mcv 19.12.2018 10:28

@Tomalak Это не дубликат. Я уже сказал, что не хочу использовать utf8 в качестве кодировки. Можно ли установить кодировку cp1252?

mcv 19.12.2018 10:40

Прочтите мой первый комментарий еще раз.

Tomalak 19.12.2018 11:31

@Tomalak Если я не указал кодировку, какая будет кодировка, выбранная для кодирования?

mcv 19.12.2018 12:38

@Tomalak Почему у меня ошибка UnicodeEncodeError: 'latin-1' codec can't encode character? Я не настраивал его для кодека latin1, но ошибка говорит о том, что MySQLdb использует кодек latin1

mcv 19.12.2018 12:40
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
7
1 001
1

Ответы 1

Вам действительно нужен cp1252, а не utf-8? Настоятельно рекомендую использовать utf-8.

Что вам нужно:

  • Передайте опцию charset = "utf8mb4" в MySQLdb.connect().
  • Настройте базу данных для использования utf-8.

Вы можете создать базу данных с помощью utf-8 с помощью CREATE DATABASE <your db name> DEFAULT CHARACTER SET utf8mb4.

Если у вас уже есть база данных, вы можете изменить набор символов по умолчанию с помощью ALTER DATABASE <your db name> CHARACTER SET utf8mb4. Но вам также необходимо изменить весь набор символов для существующих таблиц в базе данных.

Да все в порядке. А как насчет cp1252? Доступно в MySQLdb?

mcv 20.12.2018 11:47

Нет. MySQL и MySQLdb его не поддерживают. latin1 поддерживается, но плохо протестирован.

methane 21.12.2018 12:02

Все кодировки, кроме ascii и utf-8, являются устаревшими. Вы должны использовать utf-8, если нет особой причины. Я (сопровождающий PyMySQL, mysqlclient-python (он же MySQLdb) и go-sql-driver / mysql) не тестирую кодировки, отличные от utf-8.

methane 21.12.2018 12:05

MySQLdb не поддерживает его, но MySQL поддерживает кодировку cp1252. Однако он называется latin1. Вы можете сослаться сюда dev.mysql.com/doc/refman/8.0/en/charset-we-sets.html

mcv 27.12.2018 04:40

Да, я уже сказал, что "latin1 поддерживается". cp1252 - это кодировка, специфичная для Windows. Он очень похож на ISO-8859-1, но не идентичен. См. i18nqa.com/debug/table-iso8859-1-vs-windows-1252.html Вот почему я сказал, что cp1252 не поддерживается, но поддерживается latin1.

methane 28.12.2018 05:40

Но в mysql latin-1 совпадает с кодировкой cp1252. Но в MySQLdb это фактическая кодировка latin-1. Можете ли вы включить этот пункт в свой ответ? Я приму это после

mcv 03.01.2019 12:07

Что ты имеешь в виду? Вы имеете в виду, что latin-1 в MySQL на самом деле cp1252, а в MySQL нет настоящего latin-1?

methane 04.01.2019 14:00

да, пожалуйста, посмотрите параграф с официальной страницы 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.

mcv 07.01.2019 05:56

Вы можете обратиться сюда dev.mysql.com/doc/refman/8.0/en/charset-we-sets.html

mcv 07.01.2019 05:57

Спасибо. Теперь я понимаю, что вы сказали. Тогда правильный ответ: «MySQLdb не поддерживает cp1252, потому что разработчик не знал, что latin-1 в MySQL на самом деле cp1252».

methane 08.01.2019 07:05

Набор символов и кодировка действительно сложны. Я плохо разбираюсь даже в японской кодировке, хотя я японец. «Использовать только UTF-8» упрощает качество жизни разработчика в мире. Теперь я знаю, что latin-1 в MySQL на самом деле cp1252, но я настоятельно рекомендую использовать UTF-8, чтобы избежать таких проблем. Все участники этой беседы, кроме вас, не поняли ваш вопрос. Это явное свидетельство того, что всем следует использовать только ASCII или UTF-8, если они не любят неприятностей.

methane 08.01.2019 07:06

Другие вопросы по теме