解决Oracle表中数据中文显示乱码问题

问题描述

PLSQL中文显示乱码,可能是oracle客户端和服务器端的编码方式不一样。
解决Oracle表中数据中文显示乱码问题_第1张图片

  • 查询ORACLE服务器的语言、地域和字符集:
SQL> select * from nls_database_parameters;

PARAMETER               VALUE
------------------------------ ----------------------------------------
NLS_LANGUAGE               AMERICAN
NLS_TERRITORY               AMERICA
NLS_CURRENCY               $
NLS_ISO_CURRENCY           AMERICA
NLS_NUMERIC_CHARACTERS           .,
NLS_CHARACTERSET           WE8MSWIN1252
NLS_CALENDAR               GREGORIAN
NLS_DATE_FORMAT            DD-MON-RR
NLS_DATE_LANGUAGE           AMERICAN
NLS_SORT               BINARY
NLS_TIME_FORMAT            HH.MI.SSXFF AM
NLS_TIMESTAMP_FORMAT           DD-MON-RR HH.MI.SSXFF AM
NLS_TIME_TZ_FORMAT           HH.MI.SSXFF AM TZR
NLS_TIMESTAMP_TZ_FORMAT        DD-MON-RR HH.MI.SSXFF AM TZR
NLS_DUAL_CURRENCY           $
NLS_COMP               BINARY
NLS_LENGTH_SEMANTICS           BYTE
NLS_NCHAR_CONV_EXCP           FALSE
NLS_NCHAR_CHARACTERSET           AL16UTF16
NLS_RDBMS_VERSION           11.2.0.4.0

20 rows selected.

NLS_LANGUAGE 表示“语言”
NLS_TERRITORY 表示“地域”
NLS_CHARACTSET 表示“字符集”
所以“AMERICAN_AMERICA.ZHS16GBK”就是将他们三个按照“语言_地域.字符集”的格式拼接起来

  • 查看当前字符集
SQL> select userenv('language') from dual;

USERENV('LANGUAGE')
--------------------------------------------------------------------------------
AMERICAN_AMERICA.WE8MSWIN1252

问题解决

需要修改数据库编码为ZHS16GBK

SQL> shutdown immediate;
SQL> startup mount;
SQL> ALTER SYSTEM ENABLE RESTRICTED SESSION;
SQL> ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
SQL> ALTER SYSTEM SET AQ_TM_PROCESSES=0;
SQL> alter database open;
SQL> ALTER DATABASE CHARACTER SET INTERNAL_USE ZHS16GBK;
SQL> shutdown immediate;
SQL> startup; 
SQL> select userenv('language') from dual;

USERENV('LANGUAGE')
----------------------------------------------------
AMERICAN_AMERICA.ZHS16GBK

执行以上命令完成后:查看系统环境变量是否有NLL_LANG变量,没有需要添加
变量名:NLS_LANG
变量值:AMERICAN_AMERICA.ZHS16GBK
解决Oracle表中数据中文显示乱码问题_第2张图片
注意的是,此时查看表还未正常显示,解决办法是:删除表,重新创建,再添加内容

这个表是通过数据泵导入的,因此需要重新导入这个表。
导入后正常

你可能感兴趣的:(笔记,Oracle,oracle)