Python & MySql: Юникод и кодирование

Я разбираю данные json и пытаюсь сохранить некоторые данные json в базе данных Mysql. В настоящее время я получаю следующую ошибку unicode. Мой вопрос в том, как я должен справиться с этим.

  • Должен ли я обрабатывать его со стороны базы данных, и если да, то как я могу изменить свою таблицу, чтобы сделать это?
  • Должен ли я обрабатывать его со стороны python?

Вот моя структура таблицы

CREATE TABLE yahoo_questions ( question_id varchar(40) NOT NULL, question_subj varbinary(255), question_content varbinary(255), question_userId varchar(40) NOT NULL, question_timestamp varchar(40), category_id varbinary(20) NOT NULL, category_name varchar(40) NOT NULL, choosen_answer varbinary(255), choosen_userId varchar(40), choosen_usernick varchar(40), choosen_ans_timestamp varchar(40), UNIQUE (question_id) ); 

Ошибка При вставке через код python:

 Traceback (most recent call last): File "YahooQueryData.py", line 78, in <module> +"VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)", (row[2], row[5], row[6], quserId, questionTime, categoryId, categoryName, qChosenAnswer, choosenUserId, choosenNickName, choosenTimeStamp)) File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/MySQLdb/cursors.py", line 159, in execute query = query % db.literal(args) File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/MySQLdb/connections.py", line 264, in literal return self.escape(o, self.encoders) File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/MySQLdb/connections.py", line 202, in unicode_literal return db.literal(u.encode(unicode_literal.charset)) UnicodeEncodeError: 'latin-1' codec can't encode characters in position 204-230: ordinal not in range(256) 

Сегмент кода Python:

  #pushing user id to the url to get full json stack urlobject = urllib.urlopen(base_url.format(row[2])) qnadatajson = urlobject.read() data = json.loads(qnadatajson) cur.execute("INSERT INTO yahoo_questions (question_id, question_subj, question_content, question_userId, question_timestamp," +"category_id, category_name, choosen_answer, choosen_userId, choosen_usernick, choosen_ans_timestamp)" +"VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)", (row[2], row[5], row[6], quserId, questionTime, categoryId, categoryName, qChosenAnswer, choosenUserId, choosenNickName, choosenTimeStamp)) 

json Структура

 questions: [ { Id: "20111201185322AA5HTDc", Subject: "what are the new pokemon call?", Content: "I used to know them I stop at dialga and palkia version and I heard there's new ones what's it call ", Date: "2011-12-01 18:53:22", Timestamp: "1322794402", 

Что я еще делал до запуска запроса, я выполняю следующее в mysql SET character_set_client = utf8

И вот как выглядят переменные mysql:

 mysql> SHOW variables LIKE '%character_set%'; +--------------------------+--------------------------------------------------------+ | Variable_name | Value | +--------------------------+--------------------------------------------------------+ | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | latin1 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | latin1 | | character_set_system | utf8 | | character_sets_dir | /usr/local/mysql-5.5.10-osx10.6-x86_64/share/charsets/ | +--------------------------+--------------------------------------------------------+ 8 rows in set (0.00 sec) 

2 Solutions collect form web for “Python & MySql: Юникод и кодирование”

Я думаю, что ваша библиотека MYSQLdb python не знает, что она должна кодироваться в utf8 и кодируется по умолчанию для python, определяемой системой charset latin1 .

Когда вы connect() к своей базе данных, передайте параметр charset='utf8' . Это также должно сделать ненужным ручной набор SET NAMES или SET character_set_client .

Во-первых, убедитесь, что вы назначаете параметры charset и use_unicode при подключении к MySQL:

 conn = mysql.connect(host='127.0.0.1', user='user', passwd='passwd', db='db', charset='utf8', use_unicode=True) 

Во-вторых, используйте подготовленные операторы при фактическом запросе базы данных. Ниже приведен пример запроса INSERT строки, содержащей символ юникода.

 cursor.execute('INSERT INTO mytable VALUES (null, %s)', ('Some string that contains unicode: ' + unichr(300),)) 
  • Процентное кодирование UTF-8 и питон
  • Разбор строк UTF-8 / unicode с lxml HTML
  • Разделить строку unicode на 300 байтовых фрагментов без уничтожения символов
  • Как я могу фильтровать символы Emoji из моего ввода, поэтому я могу сохранить в MySQL <5.5?
  • UTF-8 HTML и CSS-файлы с спецификацией (и как удалить спецификацию с Python)
  • Кодировка на PostgreSQL, Python, Jinja2
  • В чем разница между префиксом u и префиксом unicode () в python?
  • Преобразование в UTF-8 (снова)
  • как читать файл, который может быть сохранен как ansi или unicode в python?
  • python unicode: Как я могу судить, нужно ли декодировать строку в utf-8?
  • Python ascii utf unicode
  • Python - лучший язык программирования в мире.