首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在`create_engine` of SQLAlchemy中使用“`charset`”和“`encoding`”(创建熊猫数据)?

如何在`create_engine` of SQLAlchemy中使用“`charset`”和“`encoding`”(创建熊猫数据)?
EN

Stack Overflow用户
提问于 2017-07-24 11:48:05
回答 4查看 30.9K关注 0票数 27

我对字符集和编码SQLAlchemy中的工作方式感到非常困惑。我理解(并且读过) 字符集和编码之间的区别,我对编码的历史有一个很好的了解。

我在MySQL in latin1_swedish_ci中有一张桌子(__为什么?可能是因为https://stackoverflow.com/questions/6769901/why-is-mysqls-default-collation-latin1-swedish-ci)。我需要创造一个熊猫的数据,在其中我得到了正确的字符(而不是奇怪的符号)。最初,这在代码中是这样的:

代码语言:javascript
运行
复制
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')。我希望这个方法能奏效:

代码语言:javascript
运行
复制
connect_engine = create_engine('mysql://user:password@1.1.1.1/db', encoding='utf8') 

但是,我继续得到'\x8a',我意识到,考虑到编码参数的缺省值是utf8,这是有意义的。于是,我试着用encoding='latin1'来解决这个问题:

代码语言:javascript
运行
复制
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'。在尝试了所有可能的字符集和编码组合之后,我发现这一种方法是有效的:

代码语言:javascript
运行
复制
connect_engine = create_engine('mysql://user:password@1.1.1.1/db?charset=utf8')

如果有人能解释一下如何正确使用连接字符串中的charset encoding create_engine**?**中的encoding参数,我将不胜感激。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-07-24 18:14:15

encoding是SQLAlchemy中用于编码/解码的编解码器。从文件中:

对于那些检测到DBAPI不支持Python对象的场景,这种编码用于确定源/目标编码。对于DBAPI直接处理unicode的情况,不使用。 ..。 要正确配置系统以适应Python对象,应该将DBAPI配置为最大程度地处理unicode .

mysql直接处理unicode,因此不需要使用此设置。

charset是特定于mysql驱动程序的设置。来自文献资料

此字符集是连接的客户端字符集

此设置控制服务器上的三变量,特别是character_set_results,这正是您感兴趣的内容。设置时,字符串作为unicode对象返回。

请注意,只有在数据库中有latin1编码的数据时,这才适用。如果您已经将utf-8字节存储为latin1,那么使用encoding可能会更好。

票数 10
EN

Stack Overflow用户

发布于 2018-01-18 07:38:07

encoding参数不能正常工作。

因此,正如@doru在此链接中所说的,您应该在连接字符串的末尾添加?charset=utf8mb4。就像这样:

代码语言:javascript
运行
复制
connect_string = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8mb4'.format(DB_USER, DB_PASS, DB_HOST, DB_PORT, DATABASE)
票数 24
EN

Stack Overflow用户

发布于 2018-03-22 10:51:29

我也有同样的问题。我刚刚在url的末尾添加了?charset=utf8mb4

这是我的:

先于

代码语言:javascript
运行
复制
SQL_ENGINE = sqlalchemy.create_engine('mysql+pymysql://'+MySQL.USER+':'+MySQL.PASSWORD+'@'+MySQL.HOST+':'+str(MySQL.PORT)+'/'+MySQL.DB_NAME)

代码语言:javascript
运行
复制
SQL_ENGINE = sqlalchemy.create_engine('mysql+pymysql://'+MySQL.USER+':'+MySQL.PASSWORD+'@'+MySQL.HOST+':'+str(MySQL.PORT)+'/'+MySQL.DB_NAME + "?charset=utf8mb4")
票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45279863

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档