在 Linux + Oracle 环境下出现“乱码”,通常不是 Oracle 本身坏了,而是字符集不一致或客户端/系统环境不对。下面按常见原因给你系统梳理一下。
Oracle 乱码 90% 是因为:
AL32UTF8 / ZHS16GBK)三者不一致。
SELECT parameter, value
FROM nls_database_parameters
WHERE parameter IN ('NLS_CHARACTERSET','NLS_NCHAR_CHARACTERSET');
常见结果:
AL32UTF8ZHS16GBKecho $NLS_LANG
如果为空或不对,就会乱码。
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
✅ NLS_LANG 的字符集必须和数据库一致
locale
正常 UTF-8 环境应看到:
LANG=en_US.UTF-8
LC_ALL=en_US.UTF-8
如果不是 UTF-8:
export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8
很多“看起来像 Oracle 乱码”,其实是终端软件编码不对:
Options → Session Options → Terminal → Appearance → Character encoding = UTF-8Properties → Terminal → Encoding = UTF-8?????export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
export LANG=en_US.UTF-8
sqlplus user/pass
如果是 插入数据就乱码:
jdbc:oracle:thin:@host:1521:orcl?useUnicode=true&characterEncoding=UTF-8
os.environ["NLS_LANG"] = "AMERICAN_AMERICA.AL32UTF8"
❌ 通常不能
# 1. 数据库字符集
SELECT userenv('language') FROM dual;
# 2. 客户端
echo $NLS_LANG
echo $LANG
# 3. 终端编码
locale
如果你愿意,可以告诉我:
我可以直接给你一套可复制的配置命令。