无法创建 NVARCHAR2 > 2000

Posted

技术标签:

【中文标题】无法创建 NVARCHAR2 > 2000【英文标题】:Unable to create NVARCHAR2 > 2000 【发布时间】:2020-11-30 08:30:40 【问题描述】:

在 Oracle 18c 中,我无法使用长度 >2000 的列 NVARCHAR2 创建表:

错误报告 - ORA-00910: 指定的长度对于它的数据类型来说太长了 00910. 00000 - “指定的长度对于它的数据类型来说太长了” *原因:对于数据类型 CHAR 和 RAW,指定的长度 > 2000; 否则,指定的长度 > 4000。 *行动:使用较短的长度或切换到允许的数据类型 更长的长度,例如 VARCHAR2、LONG CHAR 或 LONG RAW

这很奇怪,因为 MAX_STRING_SIZE 是 STANDARD,所以我应该最多可以存储 4000 个。

应该在 DB 设置中更改什么以允许它?

【问题讨论】:

只是问:你确定你选择了˛NVARCHAR2吗?因为,NCHAR的上限是2000... 是的,我确定。但正如我刚刚编辑的那样,对于 AL16UTF16 编码,字节数最多可以是两倍。我们使用这种编码。 【参考方案1】:

对于 MAX_STRING_SIZE = STANDARD,Oracle SQL 中 VARCHAR2NVARCHAR2RAW 类型的限制为 4000 字节

当您指定VARCHAR2(size) 时,默认情况下会将大小解释为字节长度。因此,您最多可以指定VARCHAR2(4000)

当您指定NVARCHAR2(size) 时,大小被解释为字符 长度。相关字符集为国家字符集,默认为AL16UTF16。而对于 AL16UTF16,将字符长度转换为字节长度的乘数为 2。因此,您最多可以指定 NVARCHAR2(2000),因为这将转换为 4000 字节。

设置MAX_STRING_SIZE = EXTENDEDNVARCHAR 的容量增加到32767 字节,这意味着您最多可以指定NVARCHAR2(16383)。 请注意,在现有数据库中更改MAX_STRING_SIZE 比简单地设置参数更复杂,因为某些数据库对象需要更新元数据以解决增加的VARCHAR2NVARCHAR2RAW 容量。 The process is explained in the Oracle Reference Manual.

请注意,Oracle 共享基础架构上的自治数据库云服务 (ADB-S) 默认设置为 MAX_STRING_SIZE = EXTENDED

如果您对更多细节感兴趣,有一些细微差别:

您确定需要使用NVARCHAR2 吗?通常,如果您选择支持 Unicode 的数据库字符集,例如 AL32UTF8,则可以避免使用 NCHARNVARCHAR2NCLOB 数据类型。

可以通过使用可选的 CHAR 关键字(如 VARCHAR2(1000 CHAR))或将会话中的 NLS_LENGTH_SEMANTICS 参数设置为 CHAR 来指定具有字符长度语义的 VARCHAR2 类型。

严格来说,NVARCHAR2(size) 的大小不是字符,而是国家字符集中的代码点。一些字符在 AL16UTF16 中使用两个代码点。

国家字符集默认为 AL16UTF16,但也可以是 UTF8。 Oracle documentation for NVARCAHR2 type 解释了 MAX_STRING_SIZE 和国家字符集的不同组合的 NVARCHAR2 限制:

size的最小值是1,最大值是:

如果 MAX_STRING_SIZE = EXTENDED 且国家字符集为 AL16UTF16,则为 16383

32767 如果 MAX_STRING_SIZE = EXTENDED 并且国家字符集是 UTF8

如果 MAX_STRING_SIZE = STANDARD 且国家字符集为 AL16UTF16,则为 2000

如果 MAX_STRING_SIZE = STANDARD 且国家字符集为 UTF8,则为 4000

【讨论】:

以上是关于无法创建 NVARCHAR2 > 2000的主要内容,如果未能解决你的问题,请参考以下文章

Oracle中NVARCHAR2与VARCHAR2的差别

PL/SQL 数据类型支持大于 NVarchar2 的大小

坑爹的NVARCHAR2

Oracle nclob字段类型转成nvarchar2字段类型

大型nvarchar2值返回时的oracle存储过程错误

PLSQL 将 NVARCHAR2 从 BASE64 解码为 UTF-8