一、问题描述
同事说测试库中文字符集乱码,需要处理。
二、分析处理
影响oracle数据库字符集最重要的参数是NLS_LANG参数。它的格式如下:
NLS_LANG = language_territory.charset
它有三个组成部分(语言、地域和字符集),每个成分控制了NLS子集的特性。其中:
Language 指定服务器消息的语言
territory 指定服务器的日期和数字格式
charset 指定字符集。
如:AMERICAN _ AMERICA. ZHS16GBK
SQL> select userenv('language') from dual;
USERENV('LANGUAGE')
----------------------------------------------------
AMERICAN_AMERICA.WE8MSWIN1252
在网络上查询资料后: 参考:https://blog.csdn.net/DBDoctor/article/details/51909047
将数据库置于restricted mode下,是为了防止数据库有新的非dba权限的连接
SQL> alter system enable restricted session;
System altered.
修改字符集到ZHS16GBK
SQL> ALTER DATABASE CHARACTER SET ZHS16GBK;
ALTER DATABASE CHARACTER SET ZHS16GBK
ERROR at line 1:
ORA-12712: new character set must be a superset of old character set
提示:新字符集必须为旧字符集的超集,这时可以跳过超集的检查做更改:
SQL> ALTER DATABASE character set INTERNAL_USE ZHS16GBK;
ALTER DATABASE character set INTERNAL_USE ZHS16GBK
ERROR at line 1:
ORA-12721: operation cannot execute when other sessions are active
当前有连接处于active状态,kill掉session或者重启数据库。
SQL> shutdown immediate;
SQL> startup mount;
SQL> alter system enable restricted session;
System altered.
SQL> alter database open;
Database altered.
SQL> ALTER DATABASE character set INTERNAL_USE ZHS16GBK;
Database altered.
SQL> alter system disable restricted session;
System altered.
SQL> select userenv('language') from dual;
USERENV('LANGUAGE')
----------------------------------------------------
AMERICAN_AMERICA.ZHS16GBK
-----------------------------------
20180806补充
修改完成后,在使用navicat设计表时,可能会出现报错 ORA-29275:partial multibyte character。查看资料后发现是由于 跳过超集的检查做更改导致的。 可以针对sql进行调整解决这个问题。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/31427447/viewspace-2168850/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/31427447/viewspace-2168850/