我一直在試圖導出一個大型熊貓數據框使用DataFrame.to_sql
到MySQL數據庫,但數據框在一些列中有unicode字符,其中一些在導出時會導致警告,並被轉換爲?
。熊貓DataFrame到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)
與所得到的數據庫表test
看起來像這樣:
a b
?aj 2
?aj 2
špenát 4
kv?ták 7
ku?e 1
奇怪的是,ž
,š
和á
字符(以及我的完整數據集中的其他字符)是過程sed正確,所以它似乎隻影響unicode字符的一個子集。正如你在上面看到的,我也儘可能地設置了utf-8
(engine
,DataFrame.to_sql
),但沒有效果。