如何在 RDS Oracle 数据库上将字符集 (NLS_CHARACTERSET) 和国家字符集 (NLS_NCHAR_CHARACTERSET) 更改为 UTF8?

How to change both charset (NLS_CHARACTERSET) and National Charset (NLS_NCHAR_CHARACTERSET) to UTF8 on a RDS Oracle database?

我们的应用程序旨在与具有 Charset (NLS_CHARACTERSET) 和 National Charset (NLS_NCHAR_CHARACTERSET) 都设置为UTF8.

在 Amazon Relational Database Service (RDS) 上启动 Oracle 数据库实例时,系统提示我选择设置为 UTF8 的 Charset

但是,我找不到设置 National Charset 的方法,并且此参数在数据库创建期间设置为 AL16UTF16

我尝试了以下方法:

有什么办法吗?

可以在使用 AWS CLI 创建实例期间通过指定 --character-set-name 来设置该参数。到目前为止,我还没有找到对现有实例进行更改的方法。

在我的测试中,我使用 --character-set-name KO16MSWIN949 进行设置,它将支持基于 AWS 文档的韩语:

http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Appendix.OracleCharacterSets.html

使用 Cloudformation,您也可以在 AWS::RDS::DBInstance 的 CharacterSetName 属性中进行设置。

AWS RDS 无法将 Oracle 数据库国家字符集 (NLS_NCHAR_CHARACTERSET) 设置为 UTF8。 NLS_NCHAR_CHARACTERSET 永远是 AL16UTF16。数据类型 NVARCHAR2、NCHAR 和 NCLOB 受到影响。为了便于讨论,我将这些数据类型称为 NCHAR。

使用 AL16UTF16 会对迁移产生 space 影响。顾名思义,所有字符都存储为 16 位(2 个字节)。例如,西方字母 'A' 将被补零存储为 '\0','A'.

因此,space 迁移目标的要求可能高于源。高多少取决于 NCHAR 列的流行程度。高出 25% 是经验中的实际例子。传统硬件上的 8 TB 架构需要 AWS RDS 上的 10 TB。

如果您的 NLS_CHARACTERSET 是 AL32UTF8,那么防止迁移到 space-浪费 AL16UTF16 字符集的一种方法是将您的 NCHAR 列迁移到 CHAR。示例:

来自:

CREATE TABLE ...
( "BUSINESS_UNIT" NVARCHAR2(5) NOT NULL ENABLE, 

至:

alter session set NLS_LENGTH_SEMANTICS = 'CHAR';
CREATE TABLE ...
( "BUSINESS_UNIT" VARCHAR2(5) NOT NULL ENABLE,
etc.