UnicodeDecoderError ‘ascii’ codec can‘t decode byte 0xe7 in position 0 ordinal not in range(128)

博客主要讲述使用Python 3.8.9通过psycopg2连接华为高斯gaussdb时遇到编码报错,即UnicodeDecoderError。同样操作连接PostgreSQL数据库正常,连接华为高斯gauss数据库报错。最终通过新增一行代码为数据库连接设置编码解决了问题。

一、问题描述

在使用python3.8.9通过psycopg2(版本为2.9.5)连接华为高斯gaussdb时遇到了下面报错:

在这里插入图片描述

UnicodeDecoderError ‘ascii’ codec can’t decode byte 0xe7 in position 0 ordinal not in range(128)

同样的操作连接postgresql数据库没有问题,但是连接华为高斯gauss数据库却报错了,看报错是编码问题

二、解决方式

原代码(部分隐藏):

import psycopg2
from xxx import logger

conn = psycopg2.connect(dbname="xxx",user="xxx",password="xxx",host="xxx",port=25308)
cursor = conn.cursor()

try:
	cursor.execute("xxx")
	conn.commit()
except Exception as e:
	logger.info("sql执行失败,错误信息如下:")
	logger.exception(e)
	conn.rollback()

解决后的代码:

import psycopg2
from xxx import logger

conn = psycopg2.connect(dbname="xxx",user="xxx",password="xxx",host="xxx",port=25308)
# 设置编码
conn.set_client_encoding('utf8')
cursor = conn.cursor()

try:
	cursor.execute("xxx")
	conn.commit()
except Exception as e:
	logger.info("sql执行失败,错误信息如下:")
	logger.exception(e)
	conn.rollback()

新增了一行给数据库连接设置了编码

# 设置编码
conn.set_client_encoding('utf8')

本问题解决参考文献,在此表示十分感谢:参考文献

### ASCII 编码解码错误的原因 在 Python 中遇到 `UnicodeDecodeError` 错误通常是因为尝试使用默认的 ASCII 编码去解码一个非 ASCII 字符串。ASCII 编码仅支持范围为 0 到 127 的字符集,而当程序试图处理超出此范围的字节时就会抛出异常。 ### 解决方案概述 以下是几种常见的解决方法: #### 方法一:更改文件读取模式中的编码方式 如果是在读取文件过程中发生该错误,则可以通过指定正确的编码格式来避免问题的发生。例如,可以显式设置 UTF-8 编码作为参数传递给 `open()` 函数[^1]。 ```python with open('file.txt', 'r', encoding='utf-8') as f: content = f.read() ``` #### 方法二:修改系统的默认编码(适用于 Python 2) 对于运行于 Python 2 上的应用程序来说,可能需要重新设定整个脚本执行期间所使用的标准输出流以及输入流的默认编码形式为 UTF-8 来规避此类情况[^3]。 ```python import sys reload(sys) sys.setdefaultencoding('utf8') ``` 需要注意的是这种方法并不推荐用于现代开发环境当中因为其存在一定的风险并且容易引发其他潜在隐患;另外值得注意的是,在 Python 3 版本之后已经废弃掉了上述做法而是通过更安全的方式提供了类似的机制。 #### 方法三:捕获并忽略非法字符或者替换它们 有时候我们并不关心那些无法被正确解析出来的特殊符号,此时可以选择简单地跳过这些部分而不终止程序继续向下执行下去。这可通过调整 `.decode()` 或者 `.encode()` 调用时附加额外选项实现[^2]: ```python data.decode('ascii', errors='ignore') # 忽略错误 data.decode('ascii', errors='replace') # 替换未知字符为 ? ``` 以上三种策略可以根据实际应用场景灵活选用其中一种或多种组合起来共同作用以达到最终目的即消除因不匹配而导致的功能障碍现象。 ### 结论 综上所述,针对 `'ascii' codec can't decode byte` 类型的问题有多个可行的技术手段可供采纳实施从而有效缓解乃至彻底根除这一困扰开发者已久的顽疾。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值