【问题标题】:DataFrame to_sql using wrong character set with replaceDataFrame to_sql 使用错误的字符集替换
【发布时间】:2020-01-03 10:29:38
【问题描述】:

带有 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 mysql pandas sqlalchemy


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2023-03-05
      • 1970-01-01
      • 2014-09-07
      • 2016-02-08
      • 2018-04-09
      • 1970-01-01
      • 1970-01-01
      • 2020-11-03
      • 2016-10-13
      相关资源
      最近更新 更多