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

相关推荐
科技小花2 小时前
全球化深水区,数据治理成为企业出海 “核心竞争力”
大数据·数据库·人工智能·数据治理·数据中台·全球化
X56613 小时前
如何在 Laravel 中正确保存嵌套动态表单数据(主服务与子服务)
jvm·数据库·python
johnny2333 小时前
运维管理面板:AcePanel、OpenOcta、DeepSentry
运维
青梅橘子皮3 小时前
Linux---基本指令
linux·运维·服务器
REDcker4 小时前
Linux信号机制详解 POSIX语义与内核要点 sigaction与备用栈实践
linux·运维·php
虹科网络安全4 小时前
艾体宝干货|数据复制详解:类型、原理与适用场景
java·开发语言·数据库
2301_771717214 小时前
解决mysql报错:1406, Data too long for column
android·数据库·mysql
小江的记录本5 小时前
【Kafka核心】架构模型:Producer、Broker、Consumer、Consumer Group、Topic、Partition、Replica
java·数据库·分布式·后端·搜索引擎·架构·kafka
cui_ruicheng5 小时前
Linux进程间通信(三):System V IPC与共享内存
linux·运维·服务器
dvjr cloi5 小时前
MySQL Workbench菜单汉化为中文
android·数据库·mysql