unicode编码错误“latin-1”编解码器无法编码字符“\u2019”

2ekbmq32  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(407)

我正在尝试从mysql rdb创建一个csv数据,以便将其移动到amazon redshift。但是,其中一个字段包含说明,其中一些说明包含“”字符或右单引号。在我运行代码之前,它会给我

UnicodeEncodeError: 'charmap' codec can't encode character '\x92' in position 62: character maps to <undefined>

然后我尝试使用replace来去掉正确的单引号。

db = pymysql.connect(host='host', port=3306, user="user", passwd="password", db="db", autocommit=True)
cur = db.cursor()

# cur.execute("call inv1_view_prod.`Email_agg`")

cur.execute("""select field_1, 
        field_2, 
        field_3, 
        field_4, 
        replace(field_4_desc,"’","") field_4_desc, 
        field_5, 
        field_6, 
        field_7 
from table_name """) 

emails = cur.fetchall()
with open('O:\file\path\to\file_name.csv','w') as fileout:
        writer = csv.writer(fileout)
        writer.writerows(emails)   
time.sleep(1)

但是,这给了我一个错误:

UnicodeEncodeError: 'latin-1' codec can't encode character '\u2019' in position 132: ordinal not in range(256)

我注意到132是sql语句中右单引号的位置,所以我认为代码本身可能有问题。我尝试在replace语句中使用常规的直撇号,而不是右单引号,但是这并没有替换字符,仍然返回原始错误。有人知道为什么它不接受单一报价,以及如何修复它吗?

yebdmbv4

yebdmbv41#

\u2019 是unicode ,utf-8六角 E28099 ,这是一个“右单引号”。直接拉丁1等价物是十六进制 92 . 一些字处理产品使用它来代替撇号( ' ).
您收到错误消息,不是因为您无法处理字符,而是因为配置无法声明在何处使用哪种编码。
“132”似乎无关紧要: 132 84 E2809E „ &#x84; python注解:http://mysql.rjweb.org/doc.php/charcoll#python
关于其他字符集问题的注解:utf-8字符的问题;我看到的不是我储存的
如果不知道模式或python配置,我就不能说得更具体了。

相关问题