2017-07-24 38 views
0

我對charset和encoding工作在SQLAlchemy的方式非常困惑。我瞭解(並已閱讀)charsets and encodings之間的區別,我對the history of encodings有很好的瞭解。如何在SQLAlchemy的`create_engine`中使用`charset`和`encoding`(來創建熊貓數據框)?

我在MySQL中latin1_swedish_ci 爲什麼?可能因爲this表。我需要創建一個熊貓數據框,在其中獲取正確的字符(而不是奇怪的符號)。最初,這是代碼:

connect_engine = create_engine('mysql://user:[email protected]/db') 
sql_query = "select * from table1" 
df = pandas.read_sql(sql_query, connect_engine) 

我們開始有與Š字符的麻煩(對應於u'\u0160' unicode的,而是我們得到「\ x8a」)。我預計這個工作:

connect_engine = create_engine('mysql://user:[email protected]/db', encoding='utf8') 

,但是,我要繼續'\x8a',我意識到這,是有道理鑑於編碼參數的默認值是utf8。所以,後來,我試着encoding='latin1'來解決這個問題:

connect_engine = create_engine('mysql://user:[email protected]/db', encoding='latin1') 

,但是,我仍然得到同樣的 '\ x8a'。要清楚,在這兩種情況下(encoding='utf8'encoding='latin1'),我可以做mystring.decode('latin1')但不是mystring.decode('utf8')

然後,我重新發現連接字符串中的charset參數,即'mysql://user:[email protected]/db?charset=latin1'。並試圖字符集和編碼的所有可能的組合之後,我發現這個工作:

connect_engine = create_engine('mysql://user:[email protected]/db?charset=utf8') 

我將不勝感激,如果有人可以解釋我如何正確使用charset連接字符串中,並在encoding參數create_engine

回答

2

encoding是用於在SQLAlchemy內編碼/解碼的編解碼器。從文檔:

對於其中DBAPI被檢測爲不支持 的Python unicode對象那些情況下,這編碼用於確定 源/目的編碼。對於 DBAPI直接處理unicode的情況,這是未使用

[...]

要正確地配置一個系統,以適應的Python unicode目的, 的DBAPI應當被配置爲處理UNICODE到最大程度 ,只要適合[...]

mysql-python直接處理unicode,所以不需要使用這個設置。

charset是一個特定於mysql-python驅動程序的設置。從the documentation

該字符集是客戶端的字符爲連接設置

此設置控制服務器上three variables,具體character_set_results,這是你所感興趣的東西。當設置,字符串作爲unicode對象返回。

請注意,這僅適用於您在數據庫中具有latin1編碼數據的情況。如果你已經將utf-8字節存儲爲latin1,那麼使用encoding代替你可能會更好。

+0

感謝@univerio,我仍然得到一個有點失落,因爲有好幾個名字,我不都將它們放置:(?DBAPI)*數據庫 - - >蟒蛇驅動程序>的mysql-python的界面 - > SQLAlchemy的* 。驅動程序是否與界面和DBAPI相同? –

+1

@toto_tico驅動程序與DBAPI相同。 (從技術上講,DBAPI是由PEP 249定義的接口,驅動程序是實現此接口的庫,但不需要這麼迂腐。)所以它是* database - > driver/DBAPI - > SQLAlchemy *。 – univerio

1

encoding參數無法正常工作。

所以,正如@doru在this link中所說的那樣,您應該在連接字符串的末尾添加?charset=utf8mb4。像這樣:

connect_string = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8mb4'.format(DB_USER, DB_PASS, DB_HOST, DB_PORT, DATABASE) 
0

這對我有用。

from sqlalchemy import create_engine 
from sqlalchemy.engine.url import URL 

db_url = { 
    'database': "dbname", 
    'drivername': 'mysql', 
    'username': 'myname', 
    'password': 'mypassword', 
    'host': '127.0.0.1', 
    'query': {'charset': 'utf8'}, # the key-point setting 
} 

engine = create_engine(URL(**db_url), encoding="utf8") 
相關問題