如何在SQLAlchemy的`create_engine`中使用`charset`和`encoding`(创建pandas Dataframe )?

taor4pac  于 2023-05-12  发布在  其他
关注(0)|答案(4)|浏览(237)

我对SQLAlchemy中字符集和编码的工作方式感到非常困惑。我理解(也读过)charsets and encodings之间的区别,我有一张the history of encodings的好照片。
我在MySQL中有一个latin1_swedish_ci (**为什么?**可能,因为this。我需要创建一个pandas数据框,在其中我可以获得正确的字符(而不是奇怪的符号)。最初,这是在代码中:

connect_engine = create_engine('mysql://user:password@1.1.1.1/db')
sql_query = "select * from table1"
df = pandas.read_sql(sql_query, connect_engine)

我们开始遇到Š字符的问题(对应于u'\u0160' unicode,但我们得到的是'\x8a')。我希望这能起作用:

connect_engine = create_engine('mysql://user:password@1.1.1.1/db', encoding='utf8')

但是,我继续得到'\x8a',我意识到,这是有意义的,因为默认的编码参数是utf8。于是,我尝试了encoding='latin1'来解决这个问题:

connect_engine = create_engine('mysql://user:password@1.1.1.1/db', encoding='latin1')

但我还是得到了同样的“\x8a”。需要说明的是,在这两种情况下(encoding='utf8'encoding='latin1'),我可以执行mystring.decode('latin1'),但不能执行mystring.decode('utf8')
然后,我在连接字符串中重新发现了charset参数,即'mysql://user:password@1.1.1.1/db?charset=latin1'。在尝试了所有可能的字符集和编码组合之后,我发现这一个工作:

connect_engine = create_engine('mysql://user:password@1.1.1.1/db?charset=utf8')

如果有人能告诉我如何正确使用连接字符串中的charsetcreate_engine中的encoding参数,我将不胜感激。

ha5z0ras

ha5z0ras1#

encoding参数无法正常工作。
因此,正如@doru在this link中所说的,您应该在连接字符串的末尾添加?charset=utf8mb4。就像这样:

connect_string = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8mb4'.format(DB_USER, DB_PASS, DB_HOST, DB_PORT, DATABASE)
pqwbnv8z

pqwbnv8z2#

我也有同样的问题。我刚加了**?charset=utf8mb4**在url的末尾。
以下是我的:

之前

SQL_ENGINE = sqlalchemy.create_engine('mysql+pymysql://'+MySQL.USER+':'+MySQL.PASSWORD+'@'+MySQL.HOST+':'+str(MySQL.PORT)+'/'+MySQL.DB_NAME)

之后

SQL_ENGINE = sqlalchemy.create_engine('mysql+pymysql://'+MySQL.USER+':'+MySQL.PASSWORD+'@'+MySQL.HOST+':'+str(MySQL.PORT)+'/'+MySQL.DB_NAME + "?charset=utf8mb4")
0qx6xfy6

0qx6xfy63#

encoding是SQLAlchemy* 中用于编码/解码 * 的编解码器。来自文档:
对于那些检测到DBAPI不支持Python unicode对象的场景,此编码用于确定源/目标编码。对于DBAPI直接处理unicode的情况,不使用
[...]
要正确配置系统以适应Python unicode对象,应该将DBAPI配置为最大程度地处理unicode。
mysql-python直接处理unicode,所以不需要使用此设置。
charset是特定于mysql-python驱动程序的设置。来自文档:
此字符集是连接的客户端字符集
此设置控制服务器上的three variables,特别是您感兴趣的character_set_results。设置后,字符串将作为unicode对象返回。
请注意,这仅适用于数据库中有latin 1编码数据的情况。如果你把utf-8字节存储为latin 1,那么你可能会更幸运地使用encoding

cgh8pdjw

cgh8pdjw4#

这对我很有效。

from sqlalchemy import create_engine
from sqlalchemy.engine.url import URL

db_url = {
    'database': "dbname",
    'drivername': 'mysql',
    'username': 'myname',
    'password': 'mypassword',
    'host': '127.0.0.1',
    'query': {'charset': 'utf8'},  # the key-point setting
}

engine = create_engine(URL(**db_url), encoding="utf8")

相关问题