根据数据库字符集解决py中文乱码问题

部署运行你感兴趣的模型镜像

不对。。。我查了查出问题的列值,在数据库里一个是varchar2类型,一个是nvarchar2类型。

还要再理一下。。。不管了先发出去,有时间再改好了

1.首先

查询Oracle数据库字符集

使用以下SQL语句查询当前数据库的字符集:

SELECT * FROM nls_database_parameters WHERE parameter LIKE '%CHARACTERSET%';

重点关注NLS_CHARACTERSET(客户端字符集)和NLS_NCHAR_CHARACTERSET(国家字符集)两个参数值。

可以获得值,以'ZHS16GBK为例'

设置数据库连接:

在Python中连接Oracle数据库时,可以通过cx_Oracle库实现,并结合makedsn创建DNS字符串,同时设置encodingnencoding参数以支持中文编码(如ZHS16GBKUTF-8)。以下是具体实现方法:


安装依赖

确保已安装cx_Oracle库,若未安装可通过以下命令安装:

pip install cx_Oracle


连接Oracle数据库

使用makedsn构建DNS字符串,并在连接时指定编码参数:

import cx_Oracle

# 配置连接参数
username = "your_username"
password = "your_password"
host = "your_host"
port = "1521"
service_name = "your_service_name"

# 使用makedsn创建DNS字符串
dsn = cx_Oracle.makedsn(host, port, service_name=service_name)

# 建立连接并设置编码
connection = cx_Oracle.connect(
    user=username,
    password=password,
    dsn=dsn,
    encoding="ZHS16GBK",  # 数据库字符集
    nencoding="UTF-8"     # 客户端字符集
)

# 测试连接
cursor = connection.cursor()
cursor.execute("SELECT * FROM dual")
result = cursor.fetchone()
print(result)

# 关闭连接
cursor.close()
connection.close()


关键参数说明

  • encoding:指定数据库端的字符集,需与Oracle服务器配置一致(如ZHS16GBK)。
  • nencoding:指定客户端的字符集,通常设为UTF-8以避免中文乱码。
  • makedsn:用于动态构建DNS字符串,支持hostportservice_name(或sid)。

中文乱码
确保encodingnencoding与数据库实际字符集匹配。可通过以下SQL查询数据库字符集:

SELECT value FROM nls_database_parameters WHERE parameter = 'NLS_CHARACTERSET';

2.通过chardet自动监测乱码df列的编码方式

使用chardet检测DataFrame列的编码方式

chardet库可以自动检测文本数据的编码格式。以下方法适用于检测Pandas DataFrame中列的编码方式。

安装chardet库

确保已安装chardet库,若未安装可通过以下命令安装:

pip install chardet

检测单列编码

假设DataFrame名为df,列名为column_name,检测该列的编码方式:

import chardet



result = chardet.detect(df[column_name][0])['encoding']

处理乱码数据

检测到编码后,可对列进行重新编码:


df[column_name] = df[column_name].apply(lambda x : x.decode(detected_encoding).encode('utf-8'))

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值