首页 > 解决方案 > DataFrame to_sql 使用错误的字符集替换

问题描述

带有 if_exists='replace' 的 Panda 的 to_sql() 为我的表设置了错误的字符集。为了将多个 csv 复制到 mysql 并忽略行上的错误(如重复错误),我首先将 csv 作为数据框读取,然后将 csv 复制到临时表中,最后使用此临时表执行 INSERT IGNORE 将数据放入合适的桌子。但是,当使用if_exists='replace'将数据帧放入临时表时,它将字符集设置为 latin1 而不是 utf8。这会导致错误,因为数据包含中文字符。有没有办法确保表(和适当的列)使用 UTF8?我还尝试在连接中指定字符集,但这并不能阻止 to_sql 将表(重新)设置为 latin1

相关代码:

import pandas as pd
from sqlalchemy import create_engine
import configparser

#load configuration
config = configparser.ConfigParser()
config.read('config-local.ini')

# construct database address
db_url = 'mysql+mysqlconnector://' + config['mysql']['user'] + ':' + config['mysql']['passwd'] + '@' + \
         config['mysql']['host'] + ':' + config['mysql']['port'] + \
         '/' + config['mysql']['database'] + '?charset=utf8'

engine = create_engine(db_url)
local_filename = 'some-file.csv'
df = pd.read_csv(local_filename, header=None, encoding='utf8')
try:
    # write to database
    df.to_sql('TempTable', con=engine, if_exists='replace', index=False)
except Exception as e:
    print(e)

标签: pythonmysqlpandassqlalchemy

解决方案


在数据库级别设置默认字符集和排序规则解决了这个问题。


推荐阅读