py cx_oracle 中文乱码问题分析

news/2025/11/11 17:19:20/文章来源:https://www.cnblogs.com/TruE093/p/19210910

py cx_oracle 中文乱码问题分析


如何检测编码

操作系统默认编码(文件内容的默认解码)

# file: get_encoding.py
import sys
import localeprint("locale.getpreferredencoding():", locale.getpreferredencoding())
print("sys.getfilesystemencoding():", sys.getfilesystemencoding())
print("sys.getdefaultencoding():", sys.getdefaultencoding())
  • locale.getpreferredencoding():文本模式 open() 未显式指定 encoding 时的默认编码(在 Windows 中文环境常为 cp936=GBK)。
  • sys.getfilesystemencoding():文件名的编码。
  • sys.getdefaultencoding():Python 内部默认(Py3 通常为 utf-8),不用于文件 I/O 默认。

Oracle 数据库字符集

-- 查询数据库字符集
SELECT PARAMETER, VALUE
FROM NLS_DATABASE_PARAMETERS
WHERE PARAMETER IN ('NLS_CHARACTERSET', 'NLS_NCHAR_CHARACTERSET');-- 查询会话级设置
SELECT * FROM NLS_SESSION_PARAMETERS
WHERE PARAMETER IN ('NLS_LANGUAGE','NLS_TERRITORY','NLS_CHARACTERSET');

文件自身编码(可选自动探测)

# 需要: pip install chardet
import chardetwith open('input.txt', 'rb') as f:raw = f.read()
info = chardet.detect(raw)
print(info)  # {'encoding': 'GBK', 'confidence': 0.99, ...}

读取文件的方式选取与差异

推荐:统一用“显式指定编码”的文本读取,避免依赖系统默认。

# Py2 & Py3 兼容写法
from io import open
with open('file_name.txt', 'r', encoding='utf-8') as f:text = f.read()  # 得到 Unicode 文本

常见方式对比

  • open('r')(Py3):返回 str(Unicode),自动处理换行;建议总是指定 encoding
  • open('rb'):返回 bytes,保留原始字节与换行,不做解码。
  • codecs.open('r', encoding=...)(Py2/3):按指定编码解码为文本;在 Py2 处理中更直观。
  • io.open('r', encoding=...):Py2 里提供 Py3 行为;Py3 等价于内建 open()
  • pathlib.Path.open('r', encoding=...)(Py3):面向对象路径方式,行为同 open()

换行差异示例(Windows)

import codecs, io
from pathlib import Pathwith open('test_file.txt', 'r') as f:print("open('r'):", repr(f.read()))  # 'hello\nworld'
with open('test_file.txt', 'rb') as f:print("open('rb'):", f.read())       # b'hello\r\nworld'
with codecs.open('test_file.txt', 'r', encoding='utf-8') as f:print("codecs.open:", repr(f.read()))  # 'hello\r\nworld'
with io.open('test_file.txt', 'r', encoding='utf-8') as f:print("io.open:", repr(f.read()))      # 'hello\nworld'
with Path('test_file.txt').open('r', encoding='utf-8') as f:print("pathlib.open:", repr(f.read())) # 'hello\nworld'

编码转换与入库示例

统一思路:读取时按“文件实际编码”解码为 Unicode;入库时确保客户端与数据库编码一致,或让驱动进行正确转换。

Python 3(推荐)

from io import open
import cx_Oracle# 读取文件(假设文件是 GBK)
with open('input_gbk.txt', 'r', encoding='gbk') as f:text = f.read()  # Unicode# 连接数据库(显式指定客户端编码,推荐与数据库一致,如 UTF-8)
conn = cx_Oracle.connect(user, pwd, dsn, encoding='UTF-8', nencoding='UTF-8')
cur = conn.cursor()
cur.execute("INSERT INTO t_logs(message) VALUES (:v)", v=text)
conn.commit()
cur.close(); conn.close()

Python 2

# -*- coding: utf-8 -*-
import codecs
import cx_Oracle# 读取文件(假设文件是 GBK)
with codecs.open('input_gbk.txt', 'r', encoding='gbk') as f:text_u = f.read()  # unicode# 建议设置客户端编码,确保转换正确
import os
os.environ['NLS_LANG'] = 'AMERICAN_AMERICA.AL32UTF8'  # 视数据库设置调整conn = cx_Oracle.connect(user, pwd, dsn)
cur = conn.cursor()
cur.execute(u"INSERT INTO t_logs(message) VALUES (:v)", v=text_u)
conn.commit()
cur.close(); conn.close()

可选:手动转换字节编码(不推荐)

# 将 Unicode 文本编码为数据库编码的 bytes(示例:UTF-8)
text_bytes = text_u.encode('utf-8')
# 某些驱动/接口可能需要字节流,但多数情况下直接传 Unicode 更安全

常见坑与建议

  • Windows 中文环境默认 locale.getpreferredencoding()cp936(GBK),容易误解码 UTF-8 文件导致 UnicodeDecodeError。始终显式指定 encoding
  • Py2 的 open('r') 返回字节串(str),请使用 codecs.openio.open 获取 Unicode。
  • open('rb') 不做任何转换,适合处理二进制或自控解码场景。
  • 处理换行:Py3 open(..., newline=None) 会统一换行;需要保留原始 \r\n 时使用二进制或 codecs.open
  • 统一为 Unicode 流:读取→Unicode,传输→Unicode;让 cx_Oracle/客户端处理最终编码转换更稳妥。
  • 环境变量 NLS_LANG 会影响客户端到数据库的编码转换;与数据库字符集保持一致(如 AL32UTF8)。

快速清单(Checklist)

  • 确认文件实际编码(工具或约定:UTF-8/GBK)。
  • open(..., encoding=...) 显式读取为 Unicode。
  • 查询数据库字符集并对齐客户端编码。
  • Python 变量统一为 Unicode(Py2 用 unicode,Py3 用 str)。
  • 入库前如需转换,使用 .encode(target_charset),否则直接传 Unicode。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/962560.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

30段极简Python代码:这些小技巧你都Get了么

30段极简Python代码:这些小技巧你都Get了么 Python 是机器学习最广泛采用的编程语言,它最重要的优势在于编程的易用性。如果读者对基本的 Python 语法已经有一些了解,那么这篇文章可能会给你一些启发。作者简单概览…

【图像处理基石】遥感图像高度信息提取:Python实战全流程+常用库汇总 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

vue3+vite使用 tailwindcss.css搭建

tailwindcss开发文档: https://www.tailwindcss.cn/1.按照依赖npm install -D tailwindcss postcss autoprefixer @tailwindcss/vite2.在vite.config.ts中配置import tailwindcss from @tailwindcss/vite export defau…

2025年电玩摩托定制厂家权威推荐榜单:电玩摩托游戏机/投币式电玩摩托游戏机/电玩城成人摩托源头厂家精选

在娱乐产业蓬勃发展的当下,电玩城已成为现代都市休闲的重要场所。其中,电玩摩托凭借其沉浸式体感模拟与竞技娱乐特性,持续吸引着大量玩家,是电玩城提升客流与营收的关键设备之一。为帮助您精准筛选优质供应商,本文…

案例大公开!某企业软件许可优化省200万,降本方案同行疯传!

我是IT部门经理小李,从业多年,见过无数企业被软件许可费用吃垮。我们公司的一个真实案例火了,省了200万元成本,这事儿本该保密,但既然能帮到同行,我今天就开口了。不少读者问我:“到底怎么软件许可优化省钱?”…

习题解析之:角古猜想

习题解析之:角古猜想【问题描述】一个正整数,若为偶数,则把它除以2,若为大于 1 的奇数,则把它乘以3加1。经过如此有限次运算后,可以得到整数1。 求经过多少次运算可得到整数1。 输入格式输入一个数字 输出格式第…

关键字 字面量 变量

关键字 字面量 变量关键字 字面量 变量 关键字 定义 被Java赋予了特定涵义点英文单词 特点 1.关键字的字母全部小写。 2.常用的代码编译器,对关键字有特殊颜色标记。 class关键字是什么意思? class关键字表示定义一个…

“CMTI测试电源”共模瞬态抗扰度测试方案及标准 - FORCREAT

苏州永创智能科技详解“CMTI测试电源”共模瞬态抗扰度测试方案及标准(光耦-隔离芯片-传感芯片)CMTI测试电源/全固态纳秒高压脉冲源、超宽带高压皮秒脉冲源、数百kV级的皮秒纳秒EMP/HPEM特斯拉Q 发生器、系统集成和定…

Goland 2025.2.4 11月最新版 安装、授权、使用说明

Goland 2025.2.4 11月最新版 安装、授权、使用说明2025-11-11亲测 支持最新版本2025.2.4 支持Windows、MAC、Linux一 安装 官网下载 : https://www.jetbrains.com.cn/go/ 根据提示安装 二 授权说明回复 《go》获取 新…

牛客刷题-Day21

模拟、枚举与贪心 https://ac.nowcoder.com/acm/contest/20960?from=acdiscuss牛客刷题-Day21 今日刷题:\(1031-1035\) 1031 贪心 例10-Bits解题思路 贪心。假设开始每一位都是 \(1\),从高位 \(i\) 开始枚举,如果…

C# 操作 Excel

C# 中操作 Excel 有许多强大的库可供选择,它们各有特点,适合不同的场景。下面我用一个表格汇总这些常见库及其特点,并辅以说明和代码示例库名称 类型 优点 缺点 适用场景 NuGet 安装命令ClosedXML 开源 API 直观易用…

恒利泰射频器件:国产穿心电容、高Q电容、馈通滤波器

恒利泰射频器件:国产穿心电容、高Q电容、馈通滤波器成都一家专注射频无源器件公司,其口号为:匠心制造,按需定制——成都恒利泰科技有限公司,2015年在成都崛起,旗下品牌恒利泰HenryTech,产品种类诸多,涉及行业范…

智能字幕校准系统实战(二):6级匹配算法从精确到模糊的全链路解析

系列文章:《智能字幕校准系统实战:从架构到算法的全栈技术解析》 本文为第2篇:6级智能校准算法深度解析 阅读时间:20分钟 难度:(中高级) 标签:算法设计 NLP Python Spacy 时间序列对齐前情回顾 在第1篇中,我详细…

P11802 【MX-X9-T6】『GROI-R3』Graph

首先发现就是让你组合成一些环使得其满足条件。 看目前如果有长度为 \(len\) 的环,能够最少花费 \(p\) 个这样的环组合成一个大环,那么 \(p\) 的倍数同样合法,且这是充要条件。 然后考虑一些链拼接成环的计数,设 \…

基于MATLAB实现支持向量机(SVM)分类

一、基础SVM分类代码示例 1. 使用fitcsvm函数(推荐新版MATLAB) % 加载数据集(以鸢尾花为例) load fisheriris; X = meas(:,1:2); % 选取前两个特征 Y = species;% 划分训练集和测试集(70%训练,30%测试) cv = cv…

2025年一代天骄青少年训练营最新推荐:一代天骄寒假班/一代天骄课程/一代天骄成长课程/一代天骄暑假班,专注青少年成长训练,树立个性化教育新标准

随着社会对青少年综合素质培养的重视程度不断提升,以及家庭教育理念的持续升级,青少年素质教育已从辅助性课程逐步发展为成长刚需。2025年,素质教育市场预计将进一步扩大,但伴随市场增长而来的是机构教学水平、课程…

LLM大模型原理与实践 学习笔记 - yi

LLM大模型原理与实践 学习笔记LLM大模型原理与实践项目是一个系统性的 LLM 学习教程,将从 NLP 的基本研究方法出发,根据 LLM 的思路及原理逐层深入,依次为读者剖析 LLM 的架构基础和训练过程。同时,我们会结合目前…

实用指南:React组件生命周期节点触发时机(组件加载Mount、组件更新Update、组件卸载Unmount)组件挂载

实用指南:React组件生命周期节点触发时机(组件加载Mount、组件更新Update、组件卸载Unmount)组件挂载2025-11-11 16:52 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: nor…

为什么要使用immer库?

View Post为什么要使用immer库?首先从不使用 Immer 的情况下,useState 是如何更新状态的,来开始解释 useState 的更新方式有两种: 方式1:直接设置新值 const [count, setCount] = useState(0); setCount(5); // 直…