oracle虽然在.bash_profile中设置了NLS_LANG="SIMPLIFIED CHINESE_CHINA".ZHS16GBK;export NLS_LANG,但是在查询带有中文字符的表时,仍然乱码的问题。
在生产环境中:
- 全备份数据库。
-
查看当前字符集:
select * from nls_database_parameters where parameter='NLS_CHARACTERSET';
查询到结果是RedHat操作系统自己默认的字符集:WE8ISO8859P1
-
关闭数据库
shutdown immediate;
-
启动数据库到挂载阶段;mount
startup mount;
-
限制连接会话
alter system enable restricted session;
-
查看工作进程队列;
show parameter job_queue_processes;
show parameter aq_tm_processes;
-
更改工作队列数为0个;
alter system set job_queue_processes=0;
-
打开数据库;
alter system set character=ZHS16GBK;
执行完上个命令,如果报ORA-12712,这个错误,则表示要更改的新字符集必须是老字符集的超集;
于是更改语句,执行下面的语句;
alter database character set internal_use ZHS15GBK;
- 查询当前数据库的字符集是否更改成功。
- 成功后,关闭数据库;
- 打开数据库到mount阶段;
-
更改工作队列进程数据,为第六步查询的结果;
alter system set job_queue_processes=10;
- 彻底打开数据