1. 场景:执行以下查询,查看 pycharm Sciview,可以看到乱码,因为查询结果有西欧语言(如:ÿum)

df_rows = pd.read_sql_query(sql, engine)

  1. 原因

(1)查看 DB 字符集,结果是:WE8ISO8859P1 (ISO8859)

select * from nls_database_parameters where parameter ='NLS_CHARACTERSET';

(2)查看当前默认字符集为,结果为:ASCII

>>> import sys
>>> sys.getdefaultencoding()
'ascii'

(3)原因很明显,ISO-8859-1 对应为西欧语言,范围大于 ASCII(参考:https://zh.wikipedia.org/wiki/ISO/IEC_8859-1),导致乱码

  1. 解决:可以在执行 DB 查询后为该列解码
df_rows['description'] = df_rows['description'].apply(lambda x: str(x).decode('ISO-8859-1'))
  1. 由于 ISO-8859-1 向下兼容 ASCII, 使用 json 直接解析时也会异常,由于 ASCII 不足以解析 0xff 范围内字符,需编码
# 错误的 json 解析方式
json.loads(df_rows.to_json(orient='records'))  
# 正确的 json 解析方式
json.loads(df_rows.to_json(orient='records'), encoding='ISO-8859-1')