python - 当我使用latin-1编码将utf8编码字符从pandas发送到mysql时,编码字符错误

标签 python mysql pandas encoding

当我使用latin-1编码将utf8编码字符从pandas发送到mysql时,我得到了错误的编码字符。 这是我在 mysql 中获得的示例值:

Biquíni

这是我的代码:

df.breakdown_name = df.breakdown_name.str.encode('latin-1')

send_data(DB_ENGINE, MYSQL_USER, MYSQL_PASSWORD, MYSQL_HOST, MYSQL_PORT, MYSQL_DB, MYSQL_TABLE, df)

def send_data(db, db_user, db_password, db_host, db_port, db_name, db_table, df):
    """
        Return data
             1
    """
    # print db
    # print db_user
    # print db_password
    # print db_host
    # print db_port
    # print db_name
    # print query[0:20]    
    SQL_ENGINE = '{db}://{db_user}:{db_password}@{db_host}:{db_port}/{db_name}?charset={encoding}'.format(
      db=db,
      db_user=db_user,
      db_password=db_password,
      db_host=db_host,
      db_port=db_port,
      db_name=db_name,
      encoding='latin1',
    )
    engine = create_engine(SQL_ENGINE)    
    df.to_sql(name=db_table,con=engine,schema='xxx',if_exists='append', index=False, chunksize=50)

最佳答案

我假设样本值应该是:

print u'Biquíni'.encode('latin_1').decode('utf-8') # Biquíni

因此,在您的代码中您正在执行逆变换:

print u'Biquíni'.encode('utf-8').decode('latin_1') # Biquíni

问题是当你实现链时:

  1. 将 unicode 编码为“utf-8”字节。
  2. 使用任何 1 字节编码(如“latin_1”)解码这些字节。

对于输入中的每个非 ASCII unicode 字符,您在输出中总是会收到错误的字符。发生这种情况是因为对于这样的字符,“utf-8”中至少有 2 个字节的值。

让我们看一下示例:

print ord(u'z') # 122 => ASCII
print repr(u'z'.encode('utf-8')) # 'z', 1 byte
print repr('z'.decode('latin_1')) # u'z'

正如我们所见,对于 ASCII 字符,一切正常,但是:

print ord(u'í') # 237 => non-ASCII

import unicodedata

print repr(u'í') # u'\xed'
print unicodedata.name(u'\xed') # LATIN SMALL LETTER I WITH ACUTE

print repr(u'\xed'.encode('utf-8')) # '\xc3\xad' => 2 bytes

print repr('\xc3'.decode('latin_1')) # u'\xc3' - the 1st char 
print repr('\xad'.decode('latin_1')) # u'\xad' - the 2nd char

print unicodedata.name(u'\xc3') # LATIN CAPITAL LETTER A WITH TILDE
print unicodedata.name(u'\xad') # SOFT HYPHEN

因此,在代码中,对于每个非 ASCII 字符,在使用 'utf-8' 编码后,您会得到 2 个字节,然后使用 'latin_1' 解码为 2字符,并且它们与初始字符不对应。

因此,您的程序的当前方案将产生不良结果。
我建议对代码中的 encode()decode() 步骤使用相同的编码。

关于python - 当我使用latin-1编码将utf8编码字符从pandas发送到mysql时,编码字符错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46856809/

相关文章:

python - 在python中高效读取和验证csv文件

php - 从数据库中选择多个值中的一个值

mysql - SQL Server 到 Mysql 迁移(使用 Mysql Workbench)数据传输错误

python - 将 Pandas 列转换为 DateTime

Python Pandas 日均

python - 计算 Pandas 数据框中单词的频率

python - Python的单元测试可以像 Nose 一样并行吗?

python - TensorFlow:如何通过复制张量之一来连接张量?

mysql - 如果已设置特定值,如何在表上创建触发器以在一小时后更新字段

python - 两列第一个位置的 NaN(按每个唯一值)