ORA-00910: specified length too long for its datatype

一、问题说明

有如下两个数据库:

旧库 --- DB1(有数据 )

新库 --- DB2(无数据 )

现通过expdp命令导出DB1的数据,再通过impdp导入数据至DB2,在导入数据时有如下报错:

复制代码
ORA-39083: Object type TABLE:"RUI"."TEST" failed to create with error:
ORA-00910: specified length too long for its datatype

经检查发现,是因为 "RUI"."TEST" 表有字段类型为NVARCHA2(4000)。

测试新建含 NVARCHA2(4000) 字段表,报错如下:

复制代码
SQL> create table ruitest (a nvarchar2(4000));
create table ruitest (a nvarchar2(4000))
                                       *
ERROR at line 1:
ORA-00910: specified length too long for its datatype

二、问题分析

同样是 NVARCHA2(4000),为什么在DB1可以创建成功,但在DB2却创建失败呢?

1.查看字符集
复制代码
select *from nls_database_parameters;

对比 DB1 和 DB2 的查询结果,发现参数 NLS_NCHAR_CHARACTERSET 的值不同(DB1:UTF8 DB2:AL16UTF16)

回溯原因,是因为在使用 dbca 创建 database 时,使用的是 Typical configuration ,如下图:

导致National character set 保留了默认值,等效使用 Advanced configuration 做出了如下配置:

三、处理方法

1.解决思路

可通过修改参数 max_string_size 实现创建含NVARCHA2(4000)字段的表。

在Oracle Database 12c中,我们可以为varchar2、nvarchar2和RAW数据类型指定32767 bytes 的最大长度了, 以便用户将更长的字符串存储在数据库中。

在12c之前的版本中,varchar2和nvarchar2数据类型的最大长度是4000 bytes,而raw是2000 bytes。

在12c之后的版本中,参数MAX_STRING_SIZE控制扩展数据类型extended data type的最大长度:

  • STANDARD 代表12c之前的长度限制,即varchar2、nvarchar2 4000 bytes, raw 是2000 bytes
  • EXTENDED 代表12c 32k strings新特性,varchar2、nvarchar2、raw最大长度32k bytes

Extended character data types 扩展字符类型存在以下的限制:

-不支持cluster table 簇表和index-organized tables索引组织表

-不支持intrapartition的并行DDL、UPDATE和DELETE DML

-不支持在Automatic Segment Space Management (ASSM)表空间上的intrapartition parallel direct-path inserts

2.处理方法
复制代码
SQL> ALTER SYSTEM SET MAX_STRING_SIZE = EXTENDED SCOPE=SPFILE;

SQL> shutdown  immediate;

SQL> startup upgrade;

SQL> @$ORACLE_HOME/rdbms/admin/utl32k;

SQL> shutdown  immediate;

SQL> startup

记得检查有没有产生失效对象:

复制代码
SQL> select count(*) from dba_objects where status<>'VALID';
  COUNT(*)
----------
0
3.效果验证

再次尝试,可成功建表:

复制代码
SQL> create table ruitest (a nvarchar2(4000));

Table created.

SQL> create table ruitest1(a nvarchar2(6000));

Table created.

参考:https://www.cnblogs.com/freeliver54/p/6835782.html

相关推荐
ulias2123 小时前
Linux系统中的权限问题
linux·运维·服务器
沃尔威武4 小时前
数据库 Sinks(.net8)
数据库·.net·webview
青花瓷4 小时前
Ubuntu下OpenClaw的安装(豆包火山API版)
运维·服务器·ubuntu
问简5 小时前
docker 镜像相关
运维·docker·容器
Dreamboat¿5 小时前
SQL 注入漏洞
数据库·sql
Dream of maid6 小时前
Linux(下)
linux·运维·服务器
齐鲁大虾6 小时前
统信系统UOS常用命令集
linux·运维·服务器
Benszen6 小时前
Docker容器化技术实战指南
运维·docker·容器
ZzzZZzzzZZZzzzz…6 小时前
Nginx 平滑升级:从 1.26.3 到 1.28.0,用户无感知
linux·运维·nginx·平滑升级·nginx1.26.3·nginx1.28.0
曹牧6 小时前
Oracle数据库中,将JSON字符串转换为多行数据
数据库·oracle·json