問題
將DataFrame數據保存到mysql中時,出現錯誤提示:
BLOB/TEXT column used in key specification without a key length
原因
出問題的原因是DataFrame對象索引的數據類型是TEXT/BLOB或其從屬的類型,當將其作為mysql中的主鍵的時候,如果這些數據類型缺少明確的長度值,mysql無法保證主鍵的唯一性,因為這個主鍵是一個變量,其長度是動態的。所以當使用 TEXT/BLOB類型的數據作為索引的時候,數據的長度必須提供給mysql,使其能夠明確鍵的長度。但是mysql不支持對TEXT/BLOB長度的限制。
同樣的錯誤也會出現在試圖將非TEXT/BLOB類型的數據列轉換成TEXT/BLOB類型,這些列被定義成獨立的索引。AlterTable命令會失效。
解決方法
解決這個問題的方式之一是舍棄TEXT/BLOB列作為索引,或者設置另外的列作為主鍵。如果不得不設置成主鍵,而想限制TEXT/BLOB的長度,可以嘗試使用VARCHAR並設置其長度。VARCHAR默認長度是255個字符,並且其長度必須在其聲明之后在其括號中設置,例如,VARCHAR(200)將其設置成200個字符長度。
將DataFrame數據輸出到mysql時強制將索引轉換成VARCHAR並限制其長度,其中的code是索引的標簽:
1 data.to_sql('data',engine,if_exists='replace',dtype={'code':VARCHAR(data.index.get_level_values('code').str.len().max())})
參考
http://stackoverflow.com/questions/38522513/can-pandas-with-mysql-support-text-indexes
http://stackoverflow.com/questions/1827063/mysql-error-key-specification-without-a-key-length