在 Linux + Oracle 环境中出现“乱码”,本质原因几乎都是 字符集不一致。下面从原理、常见场景、排查和解决办法四个方面说明。
数据从 客户端 → 操作系统 → Oracle 数据库 的链路中,只要有一处字符集不一致,就可能出现乱码。
主要涉及三类字符集:
典型表现:
select name from user;
?????
原因:
NLS_LANG 未设置NLS_LANG 与终端字符集不一致zh_CN.GBK如:
US7ASCIIWE8ISO8859P1⚠️ 这种无法存储中文,只能重建数据库或修改字符集(有风险)
NLS_LANGselect * from nls_database_parameters
where parameter like '%CHARACTERSET%';
常见正确值:
AL32UTF8(推荐)ZHS16GBKecho $LANG
locale
常见:
zh_CN.UTF-8zh_CN.GBKecho $NLS_LANG
如果没有输出,就是问题之一。
NLS_LANG = 终端字符集 = 数据库字符集(或兼容)
AL32UTF8(最常见)Linux 终端 UTF-8:
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
export LANG=zh_CN.UTF-8
ZHS16GBKLinux 终端 GBK:
export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
export LANG=zh_CN.GBK
⚠️ 若终端是 UTF-8,也会乱码
NLS_LANG 对应设置jdbc:oracle:thin:@host:1521:orcl
JDBC 一般自动识别数据库字符集
不要手动转码,否则更乱
vi ~/.bash_profile
加入:
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
export LANG=zh_CN.UTF-8
source ~/.bash_profile
如果你愿意,可以告诉我:
我可以帮你精准定位并给出配置命令。