Oracle字符集不一致,中文乱码问题


乱码问题:

1、在用客户端连接oracle服务器端查看数据时,中文数据可能会显示乱码

2、在dmp的导入导出时,可能会出现乱码。

主要原因:

客户端,服务器端,dmp文件中都有字符集信息,三者要与服务器端保持一致才不会出现乱码。

一、查询服务器端字符集

方法一:

select userenv('language') from dual;

select

SYS_CONTEXT('USERENV','TERMINAL') terminal,
SYS_CONTEXT('USERENV','LANGUAGE') language,
SYS_CONTEXT('USERENV','SESSIONID') sessionid,
SYS_CONTEXT('USERENV','INSTANCE') instance,
SYS_CONTEXT('USERENV','ENTRYID') entryid,
SYS_CONTEXT('USERENV','ISDBA') isdba,
SYS_CONTEXT('USERENV','NLS_TERRITORY') nls_territory,
SYS_CONTEXT('USERENV','NLS_CURRENCY') nls_currency,
SYS_CONTEXT('USERENV','NLS_CALENDAR') nls_calendar,
SYS_CONTEXT('USERENV','NLS_DATE_FORMAT') nls_date_format,
SYS_CONTEXT('USERENV','NLS_DATE_LANGUAGE') nls_date_language,
SYS_CONTEXT('USERENV','NLS_SORT') nls_sort,
SYS_CONTEXT('USERENV','CURRENT_USER') current_user,
SYS_CONTEXT('USERENV','CURRENT_USERID') current_userid,
SYS_CONTEXT('USERENV','SESSION_USER') session_user,
SYS_CONTEXT('USERENV','SESSION_USERID') session_userid,
SYS_CONTEXT('USERENV','PROXY_USER') proxy_user,
SYS_CONTEXT('USERENV','PROXY_USERID') proxy_userid,
SYS_CONTEXT('USERENV','DB_DOMAIN') db_domain,
SYS_CONTEXT('USERENV','DB_NAME') db_name,
SYS_CONTEXT('USERENV','HOST') host,
SYS_CONTEXT('USERENV','OS_USER') os_user,
SYS_CONTEXT('USERENV','EXTERNAL_NAME') external_name,
SYS_CONTEXT('USERENV','IP_ADDRESS') ip_address,
SYS_CONTEXT('USERENV','NETWORK_PROTOCOL') network_protocol,
SYS_CONTEXT('USERENV','BG_JOB_ID') bg_job_id,
SYS_CONTEXT('USERENV','FG_JOB_ID') fg_job_id,
SYS_CONTEXT('USERENV','AUTHENTICATION_TYPE') authentication_type,
SYS_CONTEXT('USERENV','AUTHENTICATION_DATA') authentication_data

from dual;

查询结果如下:

方法二:

select * from NLS_DATABASE_PARAMETERS;

IMP的时候显示的服务器端的字符集:

修改服务器端字符集:

在SQL Puls中的命令如下:
SQL> conn /as sysdba

已连接。

1.关闭数据库
SQL> shutdown immediate;

数据库已关闭。

已经卸载数据库。

2.启动到Mount
SQL> startup mount
ORACLE例程已经启动。


数据库装载完毕。
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 ZHS16GBK;

第1行出现错误:
ORA-12712: new character set must be a superset of old characterset
提示我们的字符集:新字符集必须为旧字符集的超集,这时我们可以跳过超集的检查做更改:
SQL> ALTER DATABASE character set INTERNAL_USE ZHS16GBK;

数据库已更改。
--我们看到这个过程和之前ALTERDATABASE CHARACTER SET操作的内部过程是完全相同的,也就是说INTERNAL_USE提供的帮助就是使Oracle数据库绕过了子集与超集的校验.
SQL> select * from v$nls_parameters;
RARAMETER VALUE
NAS_LANGUAGE SIMPLIFIED CHINESE
NLS_TERRITORY CHINA

……
SQL> shutdown immediate;
SQL> startup

ORA-01081:???????ORACLE-???????意思是无法启动已运行的ORACLE,请首先关闭它

至此,字符集的修改就完成了,我们可以通过输入命令验证一下,其结果已经变成了ZHS16GBK了,见下图。

SQL> select userenv(‘language’) fromdual;

二、查改客户端字符集

(一)在windows平台下,就是注册表里面相应OracleHome的NLS_LANG。

在cmd窗口,如果不设置字符集,会出现靠靠靠靠靠靠靠靠。

用set NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1

然后用exp 'xx/xx@xx as sysdba' full= file= log=

在unix平台下,就是环境变量NLS_LANG。

$echo $NLS_LANG

AMERICAN_AMERICA.ZHS16GBK

(二)在环境变量->系统变量中,新增变量名NLS_LANG,值为SIMPLIFIED CHINESE_CHINA.ZHS16GBK,与数据库服务器端字符集相同就行。然后重启电脑

当发现PLSQL软件查出来的中文数据是乱码时,用该方式是有效的。

优质内容筛选与推荐>>
1、java并发:CAS算法和ABA问题
2、40. Combination Sum II
3、VS2010之MFC串口通信的编写教程
4、Ror安装过程
5、BZOJ2333: [SCOI2011]棘手的操作


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号