SqlAlchemy + Firebird + FDB的UnicodeError

时间:2018-07-19 23:16:20

标签: python python-3.x unicode sqlalchemy

我正在尝试显示firebird 3.x数据库的结果,但是得到:

  

文件   “ /...../Envs/pos/lib/python3.6/site-packages/fdb/fbcore.py”,   b2u中的479行       返回st.decode(charset)UnicodeDecodeError:'utf-8'编解码器无法解码位置9的字节0xd1:无效的连续字节

尽管我到处都设置了utf-8:

# -- coding: UTF-8 -- 

import os

os.environ["PYTHONIOENCODING"] = "utf8"

from sqlalchemy import *

SERVIDOR = "localhost"
BASEDATOS_1 = "db.fdb"

PARAMS = dict(
    user="SYSDBA",
    pwd="masterkey",
    host="localhost",
    port=3050,
    path=BASEDATOS_1,
    charset='utf-8'
)

firebird = create_engine("firebird+fdb://%(user)s:%(pwd)s@%(host)s:%(port)d/%(path)s?charset=%(charset)s" % PARAMS, encoding=PARAMS['charset'])

def select(eng, sql):
    with eng.connect() as con:
        return eng.execute(sql)

for row in select(firebird, "SELECT * from clientes"):
    print(row)

2 个答案:

答案 0 :(得分:1)

我会尝试使用模块unidecode

您的脚本在尝试转换时崩溃,因此该模块可以为您提供帮助。正如他们在模块文档中所说的:

  

模块导出一个采用Unicode对象的函数   (Python 2.x)或字符串(Python 3.x)并返回一个字符串(可以是   在Python 3.x中编码为ASCII字节)

首先使用pip下载它,然后尝试以下操作:

import unidecode

...
if type(line) is unicode:
   line = unidecode.unidecode(line)

我希望它能解决您的问题。

答案 1 :(得分:1)

我遇到了同样的问题。
在我的情况下,数据库不在UTF-8中。 在连接字符串中设置了正确的字符集后,它起作用了:java.util.concurrent.ThreadLocalRandom