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