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软件查出来的中文数据是乱码时,用该方式是有效的。
优质内容筛选与推荐>>