我一直在尝试使用DataFrame.to_sql将大熊猫数据帧导出到MySQL数据库,但是数据帧的某些列中有unicode字符,其中一些列在导出过程中会引起警告,并被转换为?
我用这个例子再现了这个问题(删除了数据库登录名):

import pandas as pd
import sqlalchemy
import pymysql

engine = sqlalchemy.create_engine('mysql+pymysql://{}:{}@{}/{}?charset=utf8'.format(*login_info), encoding='utf-8')

df_test = pd.DataFrame([[u'\u010daj',2], \
                       ['čaj',2], \
                       ['špenát',4], \
                       ['květák',7], \
                       ['kuře',1]], \
                       columns = ['a','b'])

df_test.to_sql('test', engine, if_exists = 'replace', index = False, dtype={'a': sqlalchemy.types.UnicodeText()})

数据帧的前两行应该相同,只是定义不同。
我收到以下警告,有问题的字符(čěř)将呈现为?
/usr/local/lib/python3.6/site-packages/pymysql/cursors.py:166: Warning: (1366, "Incorrect string value: '\\xC4\\x8Daj' for column 'a' at row 1")
  result = self._query(query)
/usr/local/lib/python3.6/site-packages/pymysql/cursors.py:166: Warning: (1366, "Incorrect string value: '\\xC4\\x8Daj' for column 'a' at row 2")
  result = self._query(query)
/usr/local/lib/python3.6/site-packages/pymysql/cursors.py:166: Warning: (1366, "Incorrect string value: '\\xC4\\x9Bt\\xC3\\xA1k' for column 'a' at row 4")
  result = self._query(query)
/usr/local/lib/python3.6/site-packages/pymysql/cursors.py:166: Warning: (1366, "Incorrect string value: '\\xC5\\x99e' for column 'a' at row 5")
  result = self._query(query)

生成的数据库表如下所示:
a       b
?aj     2
?aj     2
špenát  4
kv?ták  7
ku?e    1

奇怪的是,testžš字符(以及我完整数据集中的其他字符)被正确处理,因此它似乎只影响unicode字符的一个子集。正如您在上面看到的,我还尝试在任何可能的地方(áutf-8)设置engine,但没有效果。

最佳答案

pymysql:

import pymysql
con = pymysql.connect(host='127.0.0.1', port=3306,
                  user='root', passwd='******',
                  charset="utf8mb4")

炼金术:
    db_url = sqlalchemy.engine.url.URL(drivername='mysql', host=foo.db_host,
        database=db_schema,
        query={ 'read_default_file' : foo.db_config, 'charset': 'utf8mb4' })

参见http://stackoverflow.com/questions/38363566/trouble-with-utf8-characters-what-i-see-is-not-what-i-stored解释?中的“最佳实践”:
要存储的字节未编码为utf8/utf8mb4。把这个修好。
数据库中的列是字符集utf8(或utf8mb4)。把这个修好。
另外,在读取期间检查连接是否为UTF-8。
(注意:CHARACTER SETsutf8utf8mb4对于欧洲语言是可互换的。)
这些是捷克字符?

关于mysql - 用Unicode字符将Pandas DataFrame导出到MySQL,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45618728/

10-11 19:34
查看更多