Oracle字符集检查和修改

爱谁谁
发布: 2025-09-14 08:32:13
原创
530人浏览过

在部署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端的字符集。

图改改
图改改

在线修改图片文字

图改改455
查看详情 图改改

以下是修改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;
登录后复制

以上两种方法取得的都是数据库字符集,来源于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字符集检查和修改的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号