如何在 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
。
我尝试了以下方法:
- 创建了一个新的参数组来设置
NLS_NCHAR_CHARACTERSET
,但未列出该参数。我还尝试使用 AWS CLI 强制创建具有此参数的新参数组,但未成功。
- 已尝试
ALTER
数据库,但 SYSDBA
角色在 Amazon 托管数据库实例上不可用。
- 使用不同的 Charset 参数创建不同的 Oracle RDS 数据库以检查 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.
我们的应用程序旨在与具有 Charset (NLS_CHARACTERSET
) 和 National Charset (NLS_NCHAR_CHARACTERSET
) 都设置为UTF8.
在 Amazon Relational Database Service (RDS) 上启动 Oracle 数据库实例时,系统提示我选择设置为 UTF8 的 Charset。
但是,我找不到设置 National Charset 的方法,并且此参数在数据库创建期间设置为 AL16UTF16
。
我尝试了以下方法:
- 创建了一个新的参数组来设置
NLS_NCHAR_CHARACTERSET
,但未列出该参数。我还尝试使用 AWS CLI 强制创建具有此参数的新参数组,但未成功。 - 已尝试
ALTER
数据库,但SYSDBA
角色在 Amazon 托管数据库实例上不可用。 - 使用不同的 Charset 参数创建不同的 Oracle RDS 数据库以检查 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.