【发布时间】:2017-12-29 23:55:09
【问题描述】:
我对 SQLAlchemy 中 charset 和 encoding 的工作方式感到非常困惑。我了解(并已阅读)charsets and encodings 之间的区别,并且我对the history of encodings 有很好的了解。
我在 latin1_swedish_ci 中的 MySQL 中有一个表(为什么?可能因为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 参数,我将不胜感激?
【问题讨论】:
标签: mysql pandas sqlalchemy connection-string