2015-02-11 3 views
2

Я хочу подключиться к Firebird 2.1 DB, которая использует cp1251, выполнить инструкцию и получить результат. Вот что я делаю:Python 3 + FDB: UnicodeDecodeError

import fdb 

def get_zone(reg, sps): 
    con = fdb.connect(
     dsn='172.16.16.77:database', 
     user='SYSDBA', password='1234', 
     sql_dialect=3, charset='WIN1251' 
    ) 
    cur = con.cursor() 
    select = ("SELECT ZONE " 
      "FROM ZONES " 
      "WHERE ZONE_NAME LIKE " 
      + reg[1:-3] + "% " 
      "AND ZONE < 600000 " 
      "AND ZONE NAME CONTAINING 'СПС'") 
    if not sps: 
     select = select[:-16] + 'NOT' + select[-17:] 
    cur.execute(select) 
    return cur[0] 

cur.execute(select) прерывает с ошибкой UnicodeDecodeError: 'utf-8' codec can't decode byte 0xf0 in position 0: unexpected end of data
Я хочу знать две вещи:

  1. Как избавиться от ошибки
  2. Является ли тот факт, что Python 3 работает в основном с Unicode опасным в контексте доступа к кодированной базе данных WIN1251? Если да, расскажите мне немного о том, что мне делать/избегать/etc.

Чтобы @VivekSable вопрос: прямо перед ошибкой переменная select содержит следующие строки:
SELECT ZONE FROM ZONES WHERE ZONE_NAME LIKE 'Краснодарский кр%' AND ZONE < 600000 AND ZONE NAME CONTAINING 'СПС'

+0

Можете ли вы записать 'select' значение перед' cur.execute (select) 'заявление и сдвиг с нами? –

+0

Я не знаю, как это будет работать или нет, но вы можете попробовать, как этот 'reg [1: -3] .decode (" utf-8 ")' –

+0

@VivekSable добавление '.decode (" utf-8 ") 'вызывает еще одну проблему:' AttributeError: 'str' объект не имеет атрибута 'decode'' – mekkanizer

ответ

0

Любая строка запроса отправляется WIN1251 базы данных должны быть первоначально обработаны .encode('cp1251') методом.

Смежные вопросы