首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >尽管长度相同,但对于列来说,ORA-12899值太大了。

尽管长度相同,但对于列来说,ORA-12899值太大了。
EN

Stack Overflow用户
提问于 2016-09-09 06:21:10
回答 4查看 43.3K关注 0票数 9

我正在运行以下查询。但得到奥拉-12899。尽管要插入的字符串长度是30。

代码语言:javascript
复制
INSERT INTO TABLE1 SELECT * FROM temp_Table1 where LENGTH(column1)=30;

SQL Error: ORA-12899:value too large for column "TABLE1"."column1" (actual: 31, maximum: 30)


select column1 from temp_Table1 where LENGTH(column1)=30;

Testing  - HLC/TC Design Corre

Desc temp_Table1

column1 VARCHAR2(30)

Desc Table1

column1 VARCHAR2(30)
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-09-09 07:53:20

你看到了字符和字节长度语义之间的区别

必须为VARCHAR2列指定最大长度。此最大值必须至少为1字节,尽管实际存储的字符串允许为零长度字符串('')。您可以使用CHAR限定符,例如VARCHAR2(10 CHAR),以字符而不是字节为单位给出最大长度。字符在技术上是数据库字符集的代码点。您可以使用字节限定符(例如VARCHAR2(10字节))显式地给出最大长度(以字节为单位)。如果在创建带有此列或属性的数据库对象时,列或属性定义中没有包含显式限定符,则长度语义由创建该对象的会话的NLS_LENGTH_SEMANTICS参数的值确定。

如果会话使用字节语义,则表中的列将默认为:

代码语言:javascript
复制
select value from nls_session_parameters where parameter = 'NLS_LENGTH_SEMANTICS';

VALUE                                  
----------------------------------------
BYTE                                    

create table t42(text varchar2(5));

Table T42 created.

select char_used from user_tab_columns where table_name = 'T42' and column_name = 'TEXT';

C
-
B

这与显式执行相同:

代码语言:javascript
复制
create table t42(text varchar2(5 byte));

如果源数据为5个字符,但包含任何多字节字符,则字节数将超过5个:

代码语言:javascript
复制
insert into t42 (text) values ('Hello');

1 row inserted.

insert into t42 (text) values ('Señor');

SQL Error: ORA-12899: value too large for column "SCHEMA"."T42"."TEXT" (actual: 6, maximum: 5)

这就是你所看到的。当您从另一个表中插入值时,您将对值的长度进行筛选,但是length()会计数字符而不是字节。有一个lengthb()函数可以计数字节。如果您检查所选的30个字符值的字节长度,您将看到它实际上是31个字节,因此其中一个字符是多字节的。

代码语言:javascript
复制
with t42 (text) as (
  select 'Hello' from dual
  union all select 'Señor' from dual
  union all select 'Testing  - HLC/TC Design Corre' from dual
)
select text, length(text) as chars, lengthb(text) as bytes, dump(text, 16) as hex
from t42;

TEXT                            CHARS BYTES HEX                                                                                                      
------------------------------- ----- ----- ----------------------------------------------------------------------------------------------------------
Hello                               5     5 Typ=1 Len=5: 48,65,6c,6c,6f                                                                               
Señor                               5     6 Typ=1 Len=6: 53,65,c3,b1,6f,72                                                                            
Testing  - HLC/TC Design Corre     30    31 Typ=1 Len=31: 54,65,73,74,69,6e,67,c2,a0,20,2d,20,48,4c,43,2f,54,43,20,44,65,73,69,67,6e,20,43,6f,72,72,65

dump()值中可以看到,在Testing (54,65,73,74,69,6e,67)之后,在空格和破折号(20,2d)之前,有c2,a0,即UTF-8多字节非破缺空间字符。(您经常会看到,随着卷曲引号和其他非ASCII范围的字符,在文本中已被复制,。例如,一个单词文档)。

可以将插入更改为LENGTHB(column1)=30上的筛选器(这将排除当前找到的行),也可以将列定义更改为30个字符,而不是30个字节:

代码语言:javascript
复制
drop table t42;

Table T42 dropped.

create table t42(text varchar2(5 char));

Table T42 created.

select char_used from user_tab_columns where table_name = 'T42' and column_name = 'TEXT';

C
-
C

insert into t42 (text) values ('Hello');

1 row inserted.

insert into t42 (text) values ('Señor');

1 row inserted.

或者将任何意外的多字节字符替换为单字节等效字符,如果这是可能的,并且对您的数据有意义的话;在这种情况下,正常的空间可能会工作,但是如果使用任何替换,则会破坏可能非常重要的信息。

票数 12
EN

Stack Overflow用户

发布于 2016-09-09 06:32:06

试着改变你的桌子就像

代码语言:javascript
复制
ALTER TABLE1 MODIFY column1 VARCHAR2(30 CHAR)

错误声明您的column1最多可以存储30个字符,并且您要在其中传递超过30个字符,这将导致错误。

您还可以参考本文:Oracle用于VARCHAR2和CHAR的字节或字符

票数 2
EN

Stack Overflow用户

发布于 2016-09-09 06:43:00

ORA-12899 通常情况下,随着我们的公司随着客户群、员工、利润或市场的扩张而成长和发展,与这种增长相关的数据也会发生变化。像Oracle这样的数据系统有一种天生的能力,能够在处理这种信息差异方面保持相当的灵活性。尽管如此,即使是最通用的数据库系统也需要在数据流量增加的情况下进行维护和改进。这项工作对于容纳对内存的任何限制或对参数的必要重新定义是必不可少的。ORA-12899错误是一个实例的代表,在这个实例中,数据的上升或用户的错误迫使Oracle在其请求的操作中停止运行。 问题 ORA-12899是当输入到列字符串中的值太大时发生的Oracle错误。这意味着用户试图更新或插入一个值对目标列太宽的列。将给出特定列的名称,该值的实际宽度以及该列允许的最大宽度将与此相关联。如前所述,该值可以以字符的形式给出。如果宽度以字符形式报告,这将意味着该列的字符长度语义正在运行。否则,宽度将以字节为单位。本质上,此错误是由于试图推送超过列的指定最大宽度的值或值集而产生的。那么,用户如何纠正这类错误呢? 解决方案 首先,打开OERR实用程序。用户将需要完整的ORA-12899消息才能收到关于错误的适当反馈。这将提供更多关于错误的信息,并允许进一步调查。通常,错误可能来自三个来源之一。第一个源是生成的SQL语句。第二个来源是检查源和目标列数据类型,以发现它们是否与当前格式兼容。最后,用户可以查看目标列的宽度--指定值的位置--以确保其足够大,以容纳用户预期分配的最大值。现在让我们来看一个纠正ORA-12899的例子。假设用户创建了下表: 创建表客户端( ClientID varchar2(9)主键、Client_Contact varchar2(40) NULL、Address varchar(20) NULL、Zip varchar2(5) NULL、Client_Number varchar2(11) NULL) 然后,用户尝试发出一个INSERT VALUES语句,如下所示: 在客户值中插入值( 727546345、“罗杰·霍尔康”、“-本杰明路锡拉丘兹”、“--”、“05307623754”) 用户可能尝试从这里运行该语句,但将收到以下错误消息: 从命令第7行开始的错误:插入客户端值(727546345,‘Ricky’,‘18 Benjamin Road Syracuse’,‘13208’,05307623754)错误报告: SQL Error: ORA-12899:值太大,不适合列“ORA”。“市场”。“地址”(实际: 25,最多20) 12899。00000 -“值对于列%s太大(实际:%s,最大值:%s)” 此错误语句指示变量“Address”不能容纳超过20个字符,因为这将超过列参数的宽度。当我们回顾地址值(‘18 Benjamin Road Syracuse’)时,我们可以看到字符总数(25个)超过了列宽度所允许的最大数目。要纠正这一点,用户可以将地址的VARCHAR2更改为能够容纳公司输入的典型地址长度的数量。

以上答案原稿网址

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39405026

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档