Oracle字符集检查和修改

2020-09-19  本文已影响0人  职场亮哥

Oracle字符集检查和修改

在部署重构版测试环境时,需要创建Oracle数据库,使用dbca创建数据库之后没有注意数据库本身的字符集,导致后续所有的数据库脚本执行后中文乱码。最后的解决办法是清掉全库数据,再修改字符集,重启数据库。

1、Oracle字符集概述

系统或者程序运行的环境就是一个我们常见的locale。而设置数据库locale最简单的方法就是设置NLS_LANG这个环境参数。在linux中NLS_LANG是一个环境变量,在windows中NLS_LANG是写在注册表中的。NLS_LANG这个参数由三个组成部分,分别是语言(language), 区域(territory)和字符集(character set),格式如下:

NLS_LANG = language_territory.charset

我们平时最常见的就是:AMERICAN_AMERICA.ZHS16GBKSIMPLIFIED CHINESE_CHINA.ZHS16GBK

NLS_LANG的作用官网是这样说的:

意思就是说:

2、检查Oracle Server字符集

检查Oracle Server字符集最常用的方法有两种

▶查询nls_database_parameters

select * from nls_database_parameters;

▶使用userenv函数

userenv函数返回当前会话(session)的相关信息。以下sql语句可以查询当前会话连接的数据库字符集

select userenv('language') from dual;

有关userenv('parameter')返回值的官网介绍如下

意思就是:返回的是当前会话使用的language和territory。characterset是数据库的字符集。

userenv函数的具体使用和当前会话字符集的取值详见以下链接

oracle的userenv和nls_lang详解

3、修改Oracle Server字符集

一旦数据库创建后,数据库的字符集理论上讲是不能改变的。因此,在设计和安装之初考虑使用哪一种字符集十分重要。根据Oracle的官方说明,字符集的转换是从子集到超集受支持,反之不行。如果两种字符集之间根本没有子集和超集的关系,那么字符集的转换是不受oracle支持的。对数据库server而言,错误的修改字符集将会导致很多不可测的后果,可能会严重影响数据库的正常运行,所以在修改之前一定要确认两种字符集是否存在子集和超集的关系。一般来说,除非万不得已,我们不建议修改oracle数据库server端的字符集。

以下是修改server端字符集的方法——不建议使用

SQL> conn /as sysdba 
SQL> shutdown immediate; 
SQL> startup mount 
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; 
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; 
SQL> select * from v$nls_parameters; 
重启检查是否更改完成: 
SQL> shutdown immediate;  
SQL> startup 
SQL> select * from v$nls_parameters; 

具体使用方法参见:oracle服务器和客户端字符集的查看和修改

4、检查Oracle Client字符集

windows查看nls_lang

set NLS_LANG

linux查看nls_lang

echo $NLS_LANG

5、修改Oracle Client字符集

修改客户端字符集只需要修改上述检查结果中的NLS_LANG即可。

6、整理补充

▶数据库字符集

select * from nls_database_parameters ;
select userenv('language') from dual;

▶实例字符集

select * from nls_instance_parameters; 

▶会话字符集

select * from nls_session_parameters; 

详见oracle官网:NLS Database Parameters



念念不忘,必有回响,小伙伴们帮我点个赞吧,非常感谢。

我是职场亮哥,YY高级软件工程师、四年工作经验,拒绝咸鱼争当龙头的斜杠程序员。

听我说,进步多,程序人生一把梭

如果有幸能帮到你,请帮我点个【赞】,给个关注,如果能顺带评论给个鼓励,将不胜感激。

职场亮哥文章列表:更多文章

本人所有文章、回答都与版权保护平台有合作,著作权归职场亮哥所有,未经授权,转载必究!

上一篇 下一篇

猜你喜欢

热点阅读