我对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')
如果有人能告诉我如何正确使用连接字符串中的charset
和create_engine
中的encoding
参数,我将不胜感激。
4条答案
按热度按时间ha5z0ras1#
encoding
参数无法正常工作。因此,正如@doru在this link中所说的,您应该在连接字符串的末尾添加
?charset=utf8mb4
。就像这样:pqwbnv8z2#
我也有同样的问题。我刚加了**?charset=utf8mb4**在url的末尾。
以下是我的:
之前
之后
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
。cgh8pdjw4#
这对我很有效。