首页 > 你问我答 >

问 plsql 中文乱码 编码排查修复

2026-11-10 15:24:42
最佳答案

答

plsql 中文乱码核心根源是客户端字符集和 Oracle 数据库服务端字符集不一致,也就是 NLS 相关编码参数不匹配,表现为查询结果中文变成问号方块或者乱码,新建表注释插入中文保存之后打开就变成乱码,这类问题是 Oracle 搭配 PLSQL Developer 最经典故障,排查优先从客户端环境变量 NLS_LANG 入手,其次检查数据库本身字符集,再排查 plsql 软件本身字体设置导入导出文件编码,整个排查顺序从最常见原因开始,不需要一开始就重建数据库,大部分情况修改环境变量重启 plsql 就可以解决中文乱码。

核心产生原因

Oracle 数据库编码是分层设计,一共三层编码,服务端数据库字符集,客户端环境变量 NLS_LANG,plsql 软件本身显示字体,三层任意一层编码不统一,就会出现 plsql 中文乱码。

第一类 最常见 NLS_LANG 环境变量错误,Windows 系统没有配置,或者配置成英文编码,客户端把中文按照错误编码解析,查询出来就乱码。

第二类 数据库服务端字符集本身不是支持中文的编码,比如数据库建成 WE8ISO8859P1,本身不存储中文,插入中文直接损坏,这种就算改 plsql 客户端也没用。

第三类 plsql Developer 软件字体不支持中文,比如选了纯英文字体,中文显示成方块,这个属于显示层面乱码,数据本身其实是正常的。

第四类 sql 脚本文件本身编码不对,脚本是 UTF8 保存,plsql 按照 GBK 打开执行,执行之后中文注释和数据就乱码,这个是脚本导入场景特有问题。

分步排查操作

第一步 查询数据库服务端字符集

打开 plsql 执行 sql 语句 select userenv ('language') from dual,查看数据库服务端字符集,记录编码名称,后续客户端 NLS_LANG 要和它匹配。

第二步 配置 Windows 系统环境变量 NLS_LANG

打开系统高级设置环境变量,新建系统变量,变量名 NLS_LANG,变量值填写和数据库一致的格式,例如 SIMPLIFIED CHINESE_CHINA.ZHS16GBK,保存之后重启电脑,再打开 plsql 测试中文查询。

第三步 修改 plsql 软件显示字体

打开 plsql 菜单栏 Tools Preferences,找到 Fonts 相关设置,SQL Window 字体,编辑器字体,更换成宋体微软雅黑这类支持中文的字体,应用保存,关闭窗口重新打开,解决方块类中文乱码。

第四步 检查 sql 脚本文件编码

如果是导入 sql 文件出现中文乱码,用记事本或者 notepad 打开脚本,另存为,编码选择和数据库匹配的 GBK 或者 UTF8,保存之后重新在 plsql 执行脚本。

第五步 验证数据本身是否损坏

如果前面全部操作之后依旧乱码,执行查询确认数据库底层数据已经损坏,这种情况需要恢复备份,重新导入正确编码的数据,单纯修改 plsql 设置无法修复已经损坏的数据。

方案对比表格

故障类型排查位置是否需要重启 plsql修复难度
NLS_LANG 不匹配Windows 环境变量需要简单
软件字体不支持中文plsql 偏好设置需要简单
数据库字符集不支持中文Oracle 服务端需要高
sql 脚本编码错误脚本文件本身不需要中等

补充注意要点

NLS_LANG 不要随意写 UTF8,Oracle 里面对应的是 AL32UTF8,很多新手写错编码名称依旧 plsql 中文乱码。

如果是远程数据库,本地客户端 NLS_LANG 必须和远端数据库字符集保持一致,跨版本 Oracle 有时候兼容存在差异。

已经发生乱码的数据,是编码转换错误产生的错误字符,不能靠修改字体恢复原始中文,这点要区分显示乱码和数据损坏两种情况。

综合来说,plsql 中文乱码优先修改 NLS_LANG 环境变量,其次调整软件字体,再确认数据库字符集和脚本编码,区分是显示问题还是底层数据已经损坏,再选择对应修复方案。

【常见问题】

问题 1 plsql 中文乱码修改环境变量之后为什么还不行

回答 1 plsql 中文乱码修改环境变量之后还不行,一般是数据库服务端字符集本身不支持中文,或者 sql 脚本文件编码不匹配,也有可能修改环境变量之后没有重启电脑,新参数没有生效。

问题 2 plsql 中文乱码是数据库里面数据已经坏了吗

回答 1 plsql 中文乱码不一定是数据库数据损坏,如果只是字体问题或者 NLS_LANG 编码解析错误,底层数据是正常的,修改编码之后中文可以正常显示,只有插入的时候编码冲突,底层数据才已经损坏。

问题 3 plsql 中文乱码需要修改数据库字符集吗

回答 1 plsql 中文乱码优先不修改数据库字符集,修改数据库字符集风险很高,会影响全库数据,只有确认数据库原生编码不支持中文,才考虑备份之后调整,优先调整客户端 NLS_LANG。

问题 4 plsql 中文乱码执行 sql 脚本的时候出现是什么原因

回答 1 plsql 中文乱码在执行 sql 脚本的时候出现,大多是脚本文件保存编码和数据库编码不一致,脚本是 UTF8 但是数据库是 GBK,plsql 读取脚本的时候解析中文出错,需要把脚本另存为匹配编码再执行。

【免责申明】

本内容为 plsql 中文乱码通用排查参考,不同 Oracle 版本 Windows 系统 plsql 版本参数写法存在差异,修改数据库字符集属于高风险操作,操作前务必备份数据库,本内容不能替代 Oracle 官方手册,操作风险自行承担。