【Linux Centos6/7 Oracle11g 修改Oracle字符集为ZHS16GBK(附: 其它字符集查询命令)】

  • Post author:
  • Post category:linux



前情提要

:公司

新创建

的数据库 需要修改字符为ZHS16GBK (老数据库修改字符可能比较麻烦,最好先备份数据再进行操作)



1.登录到系统,切换到oracle用户权限
[root@localhost ~]# su oracle
[oracle@localhost ~]# sqlplus / as sysdba


2.查询Oracle Sever端的字符集
# 查看数据库版本
SQL>select * from v$version 

# Oracle Server端字符集查询
SQL> select userenv('language') from dual;
# 由此可以看到现在的字符集,若不是想要的字符集,则需要修改。先退出SQL。

SQL> exit


3.查询Oracle Client端的字符集
[oracle@localhost ~]# echo $NLS_LANG
# 如果发现查出来的数据是乱码,请把client端的字符集配置成与linux操作系统相同的字符集。如果还是有乱码,则有可能是数据库中的数据存在问题,或者是oracle服务端的配置存在问题。


4.Server端字符集修改
# 将数据库启动到RESTRICTED模式下做字符集更改:
[oracle@localhost ~]# sqlplus / as sysdba

SQL> conn /as sysdba   ##登录到oracle
SQL> shutdown immediate   ##将oracle关闭
SQL> startup mount   ##进入mount模式
SQL> ALTER SYSTEM ENABLE RESTRICTED SESSION;  ##启用受限会话
System altered. 
SQL> ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;  ##设置作业队列进程为0(当设置为0的时候任何方式创建的job都无法执行)
System altered. 
SQL> ALTER SYSTEM SET AQ_TM_PROCESSES=0;      ##设置Qnnn进程和QMNC进程为0(为了防止修改字符集时还有其他任务执行)
System altered. 
SQL> alter database open;
SQL> ALTER DATABASE CHARACTER SET ZHS16GBK; 
SQL> ALTER DATABASE CHARACTER SET INTERNAL_USE ZHS16GBK;
SQL> shutdown immediate
SQL> startup
# 查看修改结果
SQL> select * from v$nls_parameters; 
SQL> exit


5.Client端字符集修改
# 在/home/oracle与/root用户目录下的.bash_profile中,添加或修改
export NLS_LANG=“AMERICAN_AMERICA.ZHS16GBK”语句

[oracle@localhost ~]# vi /home/oracle/.bash_profile

#在最后加入如下代码并保存退出
export NLS_LANG="AMERICAN_AMERICA.ZHS16GBK"

# 以下命令使配置立即生效
[oracle@localhost ~]# source /home/oracle/.bash_profile


6.重启navicat,删除现有表,重建表进行测试

(如果navicat无法连接成功,卸载后重新安装,并使用较新版本的oci文件即可)



注:如果表内已有数据,必须先备份数据,否则出现乱码无法恢复。




附: 其它字符集查询命令

# 查询dmp文件的字符集
SQL>select nls_charset_name(to_number('0354','xxxx'))from dual;

# 数据库服务器字符集
SQL>select * from nls_database_parameters
(来源于props$,是表示数据库的字符集)
 
# 客户端字符集环境
SQL>select * from nls_instance_parameters
(其来源于v$parameter,表示客户端的字符集的设置,可能是参数文件,环境变量或者是注册表)

# 会话字符集环境
SQL>select * from nls_session_parameters
(来源于v$nls_parameters,表示会话自己的设置,可能是会话的环境变量或者是altersession完成,如果会话没有特殊的设置,将与nls_instance_parameters一致)

### 如果多个设置存在的时候,NLS作用优先级别:Sql function > alter session> 环境变量或注册表> 参数文件> 数据库默认参数。字符集要求一致,但是语言设置却可以不同,语言设置建议用英文。如字符集是zhs16gbk,则nls_lang可以是American_America.zhs16gbk。



总结:本文主要参考大佬文章,其中少部分为自己个人看法和配置,个人记性不好,所以总结加记要;再次感谢CSDN各位大佬的贡献,我只是个小小搬运工。


参考大佬文献


https://blog.csdn.net/Bameirilyo/article/details/83895973


https://blog.csdn.net/Dreamer_good/article/details/78090361


https://blog.csdn.net/qq_37823979/article/details/105573522



版权声明:本文为xiongben0102原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。