摘要:*sqlchemy中create_engine()的返回的engine默認(rèn)的charset為latin-1.如果往數(shù)據(jù)庫中插入中文,則會(huì)出現(xiàn)亂碼媳否。
問題描述“
在使用sqlalchemy的sqlalchemy_core部分插入數(shù)據(jù)的時(shí)候
engine = create_engine(db_uri(AlyMonthBill.__bindkey__), encoding='utf-8',connect_args={"use_unicode":True,"charset":"utf8"})
insert_columns = [{"month":201806,"name":"cdn華北2"}]
engine.execute(
AlyMonthBill.__table__.insert(),
insert_columns
)
這里要注意的是:
encoding默認(rèn)就是''utf8",這里寫出來是為了強(qiáng)調(diào)一下栅螟【G兀可以在文檔中找到默認(rèn)值說明。
connect_args參數(shù)為字典力图,這里設(shè)置數(shù)據(jù)庫連接使用unicode編碼步绸,然后字符集為utf8.
如果不這樣子設(shè)置,當(dāng)如上的代碼中insert_columns包含的中文的時(shí)候吃媒,就會(huì)出現(xiàn)本文標(biāo)題的錯(cuò)誤瓤介。
因?yàn)檫@里默認(rèn)的connect_args的默認(rèn)編碼是latin-1,而latin-1中沒有對(duì)中文進(jìn)行編碼。
所以使用通用的編碼集utf8正確插入中文字符而不出現(xiàn)亂碼赘那,因?yàn)閙ysql一般也是用編碼集utf8或者是utf8mb4(utf8的擴(kuò)展)刑桑。
參考:
https://stackoverflow.com/questions/3942888/unicodeencodeerror-latin-1-codec-cant-encode-character
https://blog.csdn.net/wanglingxxx/article/details/52049278
https://docs.sqlalchemy.org/en/rel_1_1/core/engines.html#custom-dbapi-args
另外設(shè)置connection的charset也可以如下:
# 設(shè)置connection的chatset-方法二
e = create_engine(
"mysql+pymysql://scott:tiger@localhost/test?charset=utf8mb4")