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说明数据库字符集本身正常。三、原因分析检查系统 localelocale发现之前有报错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一开始没有输出说明系统虽然配置了LANGen_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. 设置系统默认 localelocalectl set-locale LANGen_US.UTF-8确认cat /etc/locale.conf结果LANGen_US.UTF-83. 配置 oracle 用户 NLS_LANG切换到 oracle 用户su - oracle临时设置验证export NLS_LANGAMERICAN_AMERICA.AL32UTF8 sqlplus / as sysdba如果显示Connected to: Oracle Database 19c Enterprise Edition ...说明问题解决。五、永久生效配置在oracle用户下写入环境变量cat ~/.bash_profile EOF # Oracle SQL*Plus client charset export NLS_LANGAMERICAN_AMERICA.AL32UTF8 EOF source ~/.bash_profile验证echo $LANG echo $NLS_LANG期望结果en_US.UTF-8 AMERICAN_AMERICA.AL32UTF8六、总结本次 SQL*Plus 乱码不是数据库字符集问题而是客户端环境问题。最终配置如下系统层LANGen_US.UTF-8 客户端层NLS_LANGAMERICAN_AMERICA.AL32UTF8 数据库层NLS_CHARACTERSETAL32UTF8处理这类问题时优先检查locale、LANG、NLS_LANG不要一上来就怀疑数据库字符集。数据库字符集是“大动脉”环境变量只是“衣服扣子”别为了扣子动手术。