无法创建 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 中 VARCHAR2
、NVARCHAR2
和 RAW
类型的限制为 4000 字节。
当您指定VARCHAR2(size)
时,默认情况下会将大小解释为字节长度。因此,您最多可以指定VARCHAR2(4000)
。
当您指定NVARCHAR2(size)
时,大小被解释为字符 长度。相关字符集为国家字符集,默认为AL16UTF16。而对于 AL16UTF16,将字符长度转换为字节长度的乘数为 2。因此,您最多可以指定 NVARCHAR2(2000)
,因为这将转换为 4000 字节。
设置MAX_STRING_SIZE = EXTENDED
将NVARCHAR
的容量增加到32767 字节,这意味着您最多可以指定NVARCHAR2(16383)
。
请注意,在现有数据库中更改MAX_STRING_SIZE
比简单地设置参数更复杂,因为某些数据库对象需要更新元数据以解决增加的VARCHAR2
、NVARCHAR2
和RAW
容量。 The process is explained in the Oracle Reference Manual.
请注意,Oracle 共享基础架构上的自治数据库云服务 (ADB-S) 默认设置为 MAX_STRING_SIZE = EXTENDED
!
如果您对更多细节感兴趣,有一些细微差别:
您确定需要使用NVARCHAR2
吗?通常,如果您选择支持 Unicode 的数据库字符集,例如 AL32UTF8,则可以避免使用 NCHAR
、NVARCHAR2
和 NCLOB
数据类型。
可以通过使用可选的 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的主要内容,如果未能解决你的问题,请参考以下文章