在部署oracle数据库重构版测试环境时,若未正确设置数据库字符集,可能导致后续脚本执行中文乱码。最终解决方案是清除所有数据,修改字符集,并重启数据库。
1、Oracle字符集概述
系统或程序运行的环境通常称为locale。设置数据库locale的最简单方法是通过设置NLS_LANG环境参数。在Linux中,NLS_LANG是环境变量;在Windows中,NLS_LANG存储在注册表中。NLS_LANG由三部分组成:语言(language)、区域(territory)和字符集(character set),格式如下:
常见的设置有:
和。
NLS_LANG的作用是设置客户端应用程序和数据库服务器使用的语言和区域,并设置客户端的字符集。如果客户端字符集与NLS_LANG中的charset不匹配,会导致乱码。
2、检查Oracle Server字符集
检查Oracle Server字符集的常用方法有两种:
▶查询nls_database_parameters
▶使用userenv函数
userenv函数返回当前会话(session)的相关信息。以下SQL语句可以查询当前会话连接的数据库字符集:
有关
的返回值,详见官网介绍:
返回的是当前会话使用的language和territory。characterset是数据库的字符集。
userenv函数的具体使用和当前会话字符集的取值详见以下链接:
oracle的userenv和nls_lang详解
3、修改Oracle Server字符集
一旦数据库创建后,理论上数据库的字符集是不能改变的。因此,在设计和安装之初,选择字符集非常重要。根据Oracle的官方说明,字符集的转换仅支持从子集到超集,反之则不支持。如果两种字符集之间不存在子集和超集关系,Oracle不支持字符集转换。对数据库server而言,错误的修改字符集可能导致严重后果,影响数据库的正常运行。因此,除非万不得已,不建议修改Oracle数据库server端的字符集。
以下是修改server端字符集的方法(不建议使用):
具体使用方法参见:oracle服务器和客户端字符集的查看和修改
4、检查Oracle Client字符集
在Windows上查看NLS_LANG:
在Linux上查看NLS_LANG:
5、修改Oracle Client字符集
修改客户端字符集只需更改上述检查结果中的NLS_LANG即可。
6、整理补充
▶数据库字符集
以上两种方法取得的都是数据库字符集,来源于props$,表示数据库的字符集。
▶实例字符集
主要涉及NLS_LANGUAGE、NLS_TERRITORY的值。NLS_INSTANCE_PARAMETERS来源于v$parameter。
▶会话字符集
来源于v$nls_parameters,表示会话自己的设置,可能是会话的环境变量或者是通过alter session完成。如果会话没有特殊设置,将与nls_instance_parameters一致。详见Oracle官网:NLS Database Parameters