Oracle 19c 在 Linux 环境下 SQL*Plus 登录显示 ??? 乱码处理:从 ??? 到 Connected to 的一次排查处理_2026-05-14
2026/5/15 2:36:04 网站建设 项目流程

一、问题现象

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.utf8

2. 设置系统默认 locale

localectl set-locale LANG=en_US.UTF-8

确认:

cat /etc/locale.conf

结果:

LANG=en_US.UTF-8

3. 配置 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

处理这类问题时,优先检查localeLANGNLS_LANG,不要一上来就怀疑数据库字符集。数据库字符集是“大动脉”,环境变量只是“衣服扣子”,别为了扣子动手术。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询