我对字符集和编码在SQLAlchemy中的工作方式感到非常困惑。我理解(并且读过) 字符集和编码之间的区别,我对编码的历史有一个很好的了解。
我在MySQL in latin1_swedish_ci中有一张桌子(__为什么?可能是因为https://stackoverflow.com/questions/6769901/why-is-mysqls-default-collation-latin1-swedish-ci)。我需要创造一个熊猫的数据,在其中我得到了正确的字符(而不是奇怪的符号)。最初,这在代码中是这样的:
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
encoding
和 create_engine
**?**中的encoding
参数,我将不胜感激。
发布于 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
可能会更好。
发布于 2018-01-18 07:38:07
encoding
参数不能正常工作。
因此,正如@doru在此链接中所说的,您应该在连接字符串的末尾添加?charset=utf8mb4
。就像这样:
connect_string = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8mb4'.format(DB_USER, DB_PASS, DB_HOST, DB_PORT, DATABASE)
发布于 2018-03-22 10:51:29
我也有同样的问题。我刚刚在url的末尾添加了?charset=utf8mb4。
这是我的:
先于
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")
https://stackoverflow.com/questions/45279863
复制相似问题