在 Linux + Oracle 环境下出现“乱码”,通常是字符集不一致导致的,常见于:
下面按最常见场景一步步解决。
SELECT parameter, value
FROM nls_database_parameters
WHERE parameter IN ('NLS_CHARACTERSET','NLS_NCHAR_CHARACTERSET');
常见正常字符集:
AL32UTF8(推荐)ZHS16GBK(中文常用)echo $LANG
locale
中文环境推荐:
LANG=zh_CN.UTF-8
如果不是,可临时设置:
export LANG=zh_CN.UTF-8
(永久修改需改 /etc/locale.conf 或 ~/.bash_profile)
在 ~/.bash_profile 或 ~/.bashrc 中加入:
export NLS_LANG="SIMPLIFIED CHINESE_CHINA.AL32UTF8"
或(GBK 环境):
export NLS_LANG="SIMPLIFIED CHINESE_CHINA.ZHS16GBK"
⚠️ NLS_LANG 的字符集必须和数据库一致
查看是否生效:
echo $NLS_LANG
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
(英文界面 + UTF8 数据,最稳定)
确保:
三者一致
示例:
export NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK
exp user/pass file=a.dmp
impdp user/pass directory=dp_dir dumpfile=a.dmp
(数据泵一般不依赖 NLS_LANG,但源和目标字符集要兼容)
jdbc:oracle:thin:@host:port:service + UTF-8os.environ["NLS_LANG"] = "AMERICAN_AMERICA.AL32UTF8"
✅ 数据库字符集
✅ Linux LANG
✅ NLS_LANG
✅ 终端编码(UTF-8)
✅ 客户端与数据库一致
推荐组合(最稳):
DB: AL32UTF8
LANG: zh_CN.UTF-8
NLS_LANG: AMERICAN_AMERICA.AL32UTF8
如果你能告诉我:
我可以给你更精确的命令。