2015-05-08 3 views
0

Моя реализация выглядит так: Centos Server, MySQL с сервером Rails и в настоящее время работает над новым приложением для бутылок.bottle_mysql Ошибка кодирования

У меня есть база данных, в которой я хочу поделиться датой в приложении Rails и Bottle. Некоторые данные в моей БД находятся в греческом.

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

import bottle 
import bottle_mysql 

app = bottle.Bottle() 
# dbhost is optional, default is localhost 
plugin = bottle_mysql.Plugin(dbuser='user', dbpass='pass' , dbname='db') 
app.install(plugin) 

@app.route('/show/<item>') 
def show(item, db): 
    db.execute('SELECT * from visitors where id=1') 
    row = db.fetchone() 
    if row: 
     print row['first_name'].decode("utf-8", "replace") 
     return template('showitem', page=row) 
    print "Empty" 
    return HTTPError(404, "Page not found") 

app.run(host='domain.tld', port=8080) 

Запись в моей БД являются одна строка в греческом (ID = 1) и один на английском языке (ID = 2) Без установки кодировки во время соединения: я не получаю ошибки при использовании ID = 2 Я получаю эту ошибку при использовании ID = 1

UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-8: ordinal not in range(128) 

Подключение к БД так:

plugin = bottle_mysql.Plugin(dbuser='user', dbpass='pass , dbname='db', charset='utf-8') 

Я получаю эту ошибку:

Любое обходное решение для такого рода ошибок?

UPDATE: Я изменил кодировку на моей строке подключения на «utf8» и вернулся к первой ошибке.

+0

'SHOW CREATE TABLE'. Покажите нам параметры подключения. 'SELECT col, HEX (col) ...', чтобы мы могли видеть, что было сохранено. –

+0

Не может Python работать непосредственно в utf8, и не нужно 'decode()'? –

+0

@RickJames, я не могу видеть, как это необходимо, вы можете увидеть запрос на выборку выше, здесь схемы в целом: ID - INT (11) AI PK first_name - VARCHAR (255) last_name - VARCHAR (255) электронная почта - VARCHAR (255) student_id - INT (11) created_at - DateTime updated_at - DateTime looks_part_time - TINYINT (1) looks_full_time - TINYINT (1) looks_intership - TINYINT (1) looks_research - TINYINT (1) looks_master - tinyint (1) looks_phd - tinyint (1) university_id - int (11) university_department_id - int (11) research_level - varchar (255) –

ответ

1

row['first_name'] Юникода, вам не нужно расшифровать.

В отличие от этого, вы должны кодировать его при печати, а если нет, интерпретатор python сделает это за вас (например, если вы печатаете его на stdout, интерпретатор python будет кодировать его с помощью sys.stdout.encoding).

Я получил ту же ошибку в коде, но она будет прекрасно работать после того, как я удалить .decode("utf-8", "replace")

2

Контрольный список:

  • # -*- coding: utf-8 -*- - (у вас есть что)
  • charset='utf8' в connect() вызова - это то, похоронен в bottle_mysql.Plugin? (Примечание: используйте «utf-8» и «utf8»)
  • Текст, закодированный в utf8.
  • Не нужно кодировать() или декодировать(), если вы хотите принять utf8 всюду.
  • u'...' литералов
  • <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> вблизи начала страницы HTML
  • CHARACTER SET utf8 COLLATE utf8_general_ci на колонке (или таблицы) определение в MySQL.

Ссылки: