修改oracle的字符编码集 AL32UTF8->ZHS16GBK
起因
在把dump导入oracle数据库的过程中,突然出现大量的字符串长度不够的错误
ORA-12899:value too large for column **** (actural:9,maximum:6)
方法1
查看字符编码集:
select * from V$NLS_PARAMETERS;
查看字符编码集:
select userenv(‘language’) from dual;
修改字符编码集:(有问题的解决方式)UPDATE PROPS$ SET VALUE$=‘ZHS16GBK’ WHERE NAME=‘NLS_CHARACTERSET’;
关闭:
shutdown immediate;
重启:
startup;
- 经过测试确实可以修改字符编码集,但是会导致Navicat Premium连不上oracle
ORA-25847
出现这个问题是由于修改了字符编码之后原来Navicat Premium中自带的oci.dll不支持ZHS16GBK,因此需要下载支持ZHS16GBK的oci.dll并将该文件的路径配置到Navicat Premium的【工具】-【选项】-【环境】-OCI环境中
下载链接:https://download.csdn.net/download/ichuany/11434281
- 重新加载了oci.dll文件并重启Navicat Premium,再链接数据库遇到了下面的问题
ORA-06552:PL/SQL:Compilation unit analysis terminated
ORA-06553:PLS-553:character set name is not recognized
上面的问题也与字符集的设置有关,在正式修改字符集时,oracle中至少需要修改12张数据字典表,而方法1这重直接更新PROPS$表的方式只是完成了其中的一小部分工作,存在很大的隐患。因此,正确修改oracle字符编码集的方式如下:
正确的修改字符编码集的方式
1.用sysdba用户登录
su oracle
sqlplus / as sysdba
2.依次执行如下命令
SQL> shutdown immediate;
SQL> startup mount;
SQL> alter session set sql_trace=true;
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 internal_use ZHS16GBK;
SQL> shutdown immediate;
SQL> startup