Oracle 19c 在 Linux 环境下 SQL*Plus 登录显示 ??? 乱码处理:从 ??? 到 Connected to 的一次排查处理_2026-05-14
一、问题现象
Oracle 19c 使用 SQL*Plus 登录时,连接可以成功,但提示信息显示乱码:
sqlplus / as sysdba异常显示类似:
???: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production Version 19.25.0.0.0数据库可以正常连接,说明并不是数据库无法启动或连接失败。
二、环境信息
操作系统:
Oracle Linux Server 8.10数据库版本:
Oracle Database 19c Version 19.25.0.0.0数据库字符集:
select parameter, value from nls_database_parameters where parameter in ('NLS_CHARACTERSET','NLS_NCHAR_CHARACTERSET');结果:
NLS_CHARACTERSET AL32UTF8 NLS_NCHAR_CHARACTERSET AL16UTF16说明数据库字符集本身正常。
三、原因分析
检查系统 locale:
locale发现之前有报错:
Cannot set LC_CTYPE to default locale Cannot set LC_MESSAGES to default locale Cannot set LC_ALL to default locale再检查:
locale -a | grep -i en_US一开始没有输出,说明系统虽然配置了:
LANG=en_US.UTF-8但实际上没有安装对应的英文 UTF-8 语言包。
同时检查 Oracle 客户端字符集:
echo $NLS_LANG结果为空。
所以根因是:
1. 操作系统缺少 en_US.UTF-8 locale 2. oracle 用户未配置 NLS_LANG四、处理步骤
1. root 用户安装英文语言包
dnf install -y glibc-langpack-en检查:
locale -a | grep -i en_US正常应看到:
en_US.utf82. 设置系统默认 locale
localectl set-locale LANG=en_US.UTF-8确认:
cat /etc/locale.conf结果:
LANG=en_US.UTF-83. 配置 oracle 用户 NLS_LANG
切换到 oracle 用户:
su - oracle临时设置验证:
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8 sqlplus / as sysdba如果显示:
Connected to: Oracle Database 19c Enterprise Edition ...说明问题解决。
五、永久生效配置
在oracle用户下写入环境变量:
cat >> ~/.bash_profile <<'EOF' # Oracle SQL*Plus client charset export NLS_LANG=AMERICAN_AMERICA.AL32UTF8 EOF source ~/.bash_profile验证:
echo $LANG echo $NLS_LANG期望结果:
en_US.UTF-8 AMERICAN_AMERICA.AL32UTF8六、总结
本次 SQL*Plus 乱码不是数据库字符集问题,而是客户端环境问题。
最终配置如下:
系统层:LANG=en_US.UTF-8 客户端层:NLS_LANG=AMERICAN_AMERICA.AL32UTF8 数据库层:NLS_CHARACTERSET=AL32UTF8处理这类问题时,优先检查locale、LANG、NLS_LANG,不要一上来就怀疑数据库字符集。数据库字符集是“大动脉”,环境变量只是“衣服扣子”,别为了扣子动手术。
