2017-08-10 83 views
1

我一直在試圖導出一個大型熊貓數據框使用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-8engine,DataFrame.to_sql),但沒有效果。

回答

0

pymysql:

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

SQLAlchemy的:

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。解決這個問題。
  • 數據庫中的列是CHARACTER SET utf8(或utf8mb4)。解決這個問題。
  • 另外,檢查讀取期間的連接是否爲UTF-8。

(注:CHARACTER SETsutf8utf8mb4是可以互換的歐洲語言)

這是捷克字符?