问题描述
PLSQL中文显示乱码,可能是oracle客户端和服务器端的编码方式不一样。
- 查询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
注意的是,此时查看表还未正常显示,解决办法是:删除表,重新创建,再添加内容
这个表是通过数据泵导入的,因此需要重新导入这个表。
导入后正常