编码字符的字符串值不正确-python插入到我的sql中

编码字符的字符串值不正确-python插入到我的sql中,python,mysql,utf-8,Python,Mysql,Utf 8,我正在从amazon解析一个报表,将行拆分为字段,然后创建一个mysql上传。我相信数据最初是iso-8859-1。数据上传到mysql很好,除非它有一些特殊字符,比如一个Äor®。如果发生这种情况,我会得到一个类似pymysql.err.InternalError:1366的错误,不正确的字符串值:“\\xAE Kids…”对于第74行的“item name”列&TypeError:只能将str not bytearray连接到str。我可以通过替换字节来解决这个问题,但我不想构建一个巨大的列

我正在从amazon解析一个报表,将行拆分为字段,然后创建一个mysql上传。我相信数据最初是iso-8859-1。数据上传到mysql很好,除非它有一些特殊字符,比如一个Äor®。如果发生这种情况,我会得到一个类似pymysql.err.InternalError:1366的错误,不正确的字符串值:“\\xAE Kids…”对于第74行的“item name”列&TypeError:只能将str not bytearray连接到str。我可以通过替换字节来解决这个问题,但我不想构建一个巨大的列表,而且我真的想存储正确的值。我试图改变我的mysql字符集和排序规则,但这似乎没有解决。我觉得修复是一个简单的修复,但我已经尝试了几个小时的事情

report_as_dict = report.parsed
report_as_dict = report_as_dict.replace(b' \r\n', b'\r\n')  # remove black space at end

 multi_line_rebuild=list()
    for line in line_split[1:]:
        field_split = line.split(b'\t')
        logger.debug('Field Split : %s', field_split)
        field_split = [x.replace(b'\x92', b'') for x in field_split]  # removes single quotes
        field_split = [x.replace(b'\xA0', b'') for x in field_split]  # removes (
        field_split = [x.replace(b'\xAE', b'') for x in field_split]  # removes @
        field_split = [x.replace(b'\xCD', b'l') for x in field_split]  # replaces l with ' with l
        field_split = [x.replace(b'\xE4', b'a') for x in field_split]  # replaces a with two dots with a

        multi_line_rebuild.append(field_split)

 ....


 run_query_with_warnings(query_string, field_split=multi_line_rebuild)
作用

def run_query_with_warnings(warn_type, query_string, **kargs):

db = MySQLdb.connect(host=cred.host, user=cred.user, password=cred.password, db=cred.db, port=cred.port)
cursor = db.cursor()
cursor.executemany(query_string, kargs['field_split'])

代码试图将编码为ISO-8859-1的文本写入设置为预期UTF-8的表

有两种解决方案:

将连接上的charset参数设置为latin1这与ISO-8859-1相同,并让连接处理将字节重新编码为UTF-8

db = MySQLdb.connect(host=cred.host, user=cred.user, password=cred.password, 
                     db=cred.db, port=cred.port, charset='latin1')
将编码的字节解码为str,并让连接执行编码

report_as_dict = report.parsed.decode('ISO-8859-1')

如果代码除了将字节直接写入数据库之外什么都不做,那么第一个选项就可以了;如果字节正在经历进一步的操作,那么解码到str将使事情变得简单

客户机正在使用拉丁1编码92等。该表希望右单引号使用utf8编码E28099。您可以通过告诉MySQL客户机在连接参数中使用拉丁语1,并让列为utf8或utf8mb4来实现这一点

前者有点像

db = MySQLdb.connect(host=DB_HOST, user=DB_USER, passwd=DB_PASS, db=DB_NAME,
              charset="utf8", use_unicode=True)
还要检查是否应将源代码的开头更改为

# -*- coding: utf-8 -*-

但是。。。我很担心。你真的使用了正确的引号、注册符号AE、I-急性和a-双点吗?或者这仅仅是其他混乱局面的开始?有时一行中有多个字节是“坏的”。为了进一步分析您的情况,请获取超过一个字节的十六进制,和/或提供您认为文本应该包含的字符。

每个表都是utf8/utf8\u general\u ciThanks。。。如果我的所有数据都是ISO-8859-1,那么更改表的数据类型是否有意义?@personalt UTF-8支持所有unicode代码点,而ISO-8859-1只支持256个,因此通常我倾向于使用UTF-8。另一方面,如果您知道数据的编码永远不会更改,那么更改表的编码可能是值得的。