带有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)
最佳答案
在数据库级别设置默认字符集和排序规则可以解决该问题。
关于python - DataFrame to_sql使用错误字符集替换,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59576953/