首先需要确认Oracle数据库的字符集是否设置为支持中文的UTF-8(或AL32UTF8),这是避免乱码的基础。
执行以下SQL查询数据库字符集:
SELECT * FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER IN ('NLS_CHARACTERSET', 'NLS_NCHAR_CHARACTERSET');
若结果中NLS_CHARACTERSET不是AL32UTF8或UTF8,需修改数据库字符集(需DBA权限,且需备份数据):
-- 关闭数据库
SHUTDOWN IMMEDIATE;
-- 以挂载模式启动
STARTUP MOUNT;
-- 开启受限会话
ALTER SYSTEM ENABLE RESTRICTED SESSION;
-- 设置作业队列进程为0
ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
-- 设置高级队列进程为0
ALTER SYSTEM SET AQ_TM_PROCESSES=0;
-- 打开数据库
ALTER DATABASE OPEN;
-- 修改字符集(内部使用,需谨慎)
ALTER DATABASE CHARACTER SET INTERNAL_USE AL32UTF8;
-- 重启数据库
SHUTDOWN IMMEDIATE;
STARTUP;
再次查询确认字符集已修改为AL32UTF8。
若系统未安装中文支持包,即使字符集设置正确,仍可能显示乱码(如中文提示变为“??”)。
使用yum安装中文字体包:
yum install -y fonts-chinese* fonts-ISO8859*
安装完成后,重启系统或重新登录使字体生效。
SQL*Plus的字符集需与数据库字符集一致,通过设置NLS_LANG环境变量实现。
编辑Oracle用户的~/.bashrc(或~/.bash_profile)文件,添加以下内容:
export NLS_LANG="AMERICAN_AMERICA.AL32UTF8" # 或 SIMPLIFIED CHINESE_CHINA.AL32UTF8(根据数据库字符集选择)
export LANG="en_US.UTF-8" # 系统语言环境,建议与NLS_LANG前半部分一致
保存后执行source ~/.bashrc使配置生效。
若需全局生效,可将上述内容添加到/etc/profile中,并执行source /etc/profile。
确保终端(如GNOME Terminal、SecureCRT)的字符集与数据库一致(UTF-8)。
重新登录SQL*Plus,执行以下命令验证会话字符集:
SELECT value FROM nls_session_parameters WHERE parameter = 'NLS_CHARACTERSET';
若结果为AL32UTF8(或与数据库一致),则说明配置成功。此时插入或查询中文数据应能正常显示。
AL32UTF8但仍乱码,需检查数据是否以正确字符集插入(如插入时未转换字符集导致数据损坏)。