Oracle字符集检查和修改

在部署oracle数据库重构版测试环境时,若未正确设置数据库字符集,可能导致后续脚本执行中文乱码。最终解决方案是清除所有数据,修改字符集,并重启数据库。

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.ZHS16GBK

SIMPLIFIED CHINESE_CHINA.ZHS16GBK

NLS_LANG的作用是设置客户端应用程序和数据库服务器使用的语言和区域,并设置客户端的字符集。如果客户端字符集与NLS_LANG中的charset不匹配,会导致乱码。

2、检查Oracle Server字符集

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

▶查询nls_database_parameters

select * from nls_database_parameters;

▶使用userenv函数

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

select userenv('language') from dual;

有关

userenv('parameter')

的返回值,详见官网介绍:

Oracle字符集检查和修改

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

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

oracle的userenv和nls_lang详解

3、修改Oracle Server字符集

一旦数据库创建后,理论上数据库的字符集是不能改变的。因此,在设计和安装之初,选择字符集非常重要。根据Oracle的官方说明,字符集的转换仅支持从子集到超集,反之则不支持。如果两种字符集之间不存在子集和超集关系,Oracle不支持字符集转换。对数据库server而言,错误的修改字符集可能导致严重后果,影响数据库的正常运行。因此,除非万不得已,不建议修改Oracle数据库server端的字符集。

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

SQL> conn /as sysdbaSQL> shutdown immediate;SQL> startup mountSQL> 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> startupSQL> 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;

以上两种方法取得的都是数据库字符集,来源于props$,表示数据库的字符集。

▶实例字符集

select * from nls_instance_parameters;

主要涉及NLS_LANGUAGE、NLS_TERRITORY的值。NLS_INSTANCE_PARAMETERS来源于v$parameter。

▶会话字符集

select * from nls_session_parameters;

来源于v$nls_parameters,表示会话自己的设置,可能是会话的环境变量或者是通过alter session完成。如果会话没有特殊设置,将与nls_instance_parameters一致。详见Oracle官网:NLS Database Parameters

Oracle字符集检查和修改

以上就是Oracle字符集检查和修改的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/169484.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月1日 01:37:52
下一篇 2025年11月1日 01:42:39

相关推荐

发表回复

登录后才能评论
关注微信