web-dev-qa-db-fra.com

Valeur ORA-12899 trop grande pour la colonne malgré la même longueur

J'exécute la requête suivante. Mais obtenir ORA-12899. Bien que la longueur de la chaîne que je tente d’insérer soit de 30.

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)
6
Shitu

Vous constatez la différence entre la sémantique du caractère et de la longueur en octets :

Vous devez spécifier une longueur maximale pour une colonne VARCHAR2. Ce maximum doit être d'au moins 1 octet, bien que la chaîne stockée puisse être une chaîne de longueur nulle (''). Vous pouvez utiliser le qualificatif CHAR, par exemple VARCHAR2 (10 CHAR), pour indiquer la longueur maximale en caractères au lieu d'octets. Techniquement, un caractère est un point de code du jeu de caractères de la base de données. Vous pouvez utiliser le qualificatif BYTE, par exemple VARCHAR2 (10 BYTE), pour indiquer explicitement la longueur maximale en octets. Si aucun qualificateur explicite n'est inclus dans une définition de colonne ou d'attribut lorsqu'un objet de base de données contenant cette colonne ou cet attribut est créé, la sémantique de longueur est déterminée par la valeur du paramètre NLS_LENGTH_SEMANTICS de la session créant l'objet. 

Si votre session utilise la sémantique d'octets, la colonne de votre tableau aura par défaut la valeur suivante:

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

C'est la même chose que de faire explicitement:

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

Si vos données source comportent cinq caractères mais incluent des caractères multi-octets, le nombre de octets sera supérieur à cinq:

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)

C'est ce que vous voyez. Lorsque vous insérez les valeurs de votre autre table, vous filtrez sur la longueur des valeurs, mais length() compte les caractères plutôt que les octets. Il existe une fonction lengthb() qui compte les octets. Si vous vérifiez la longueur en octets de la valeur de 30 caractères que vous sélectionnez, vous verrez qu'il s'agit en fait de 31 octets. L'un de ces caractères est donc multi-octets.

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

Dans les valeurs dump(), vous pouvez voir qu'après Testing (54,65,73,74,69,6e,67) et avant l'espace et le tiret (20,2d), vous avez c2,a0, qui est le caractère d'espace insécable multibyte UTF-8 . (Vous voyez souvent cela, avec des guillemets bouclés et d'autres caractères non-ASCII, dans du texte copié d'un document Word, par exemple).

Vous pouvez modifier votre insertion pour filtrer sur LENGTHB(column1)=30 (ce qui exclura la ligne que vous trouvez actuellement) ou modifier la définition de votre colonne en 30 caractères au lieu de 30 octets:

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.

Ou remplacez tous les caractères multi-octets inattendus par des équivalents à un octet, si cela est possible et logique pour vos données; dans ce cas, un espace normal pourrait fonctionner, mais avec toute substitution, vous détruisez des informations qui pourraient être réellement importantes.

7
Alex Poole

Essayez de changer votre table comme

ALTER TABLE1 MODIFY column1 VARCHAR2(30 CHAR)

L'erreur indique que votre colonne1 peut stocker un maximum de 30 caractères et que vous y passez plus de 30 caractères, ce qui entraîne l'erreur.

Vous pouvez également consulter cet article: Base de données Oracle - Octets ou caractères pour VARCHAR2 et CHAR

2
Rahul Tripathi

ORA-12899

Souvent, lorsque nos entreprises se développent et évoluent en réponse à un expansion sous forme de clientèle, de personnel, de bénéfices ou de marchés, le les données associées à cette croissance vont également changer. Les systèmes de données comme Oracle a la capacité innée de rester assez flexible en ce qui concerne travailler avec cet écart dans l'information. Pourtant, même le plus Les systèmes de bases de données polyvalents nécessitent des opérations de maintenance et de perfectionnement dans le fichier face à l'augmentation du trafic de données. Ce travail est essentiel pour tenir compte des contraintes de mémoire ou des redéfinitions nécessaires de paramètres. L'erreur ORA-12899 est représentative d'une instance de qu’une hausse de données ou une erreur de l’utilisateur force Oracle à décrochage au cours de l'action demandée.

LE PROBLÈME

L'ORA-12899 est une erreur Oracle qui se produit lorsque la valeur est entrée dans la colonne est trop grande. Qu'est-ce que cela signifie, c'est qu'un L'utilisateur a tenté de mettre à jour ou d'insérer une colonne avec une valeur c'est trop large pour la colonne de destination. Le nom d'un particulier colonne sera donné et la largeur réelle de la valeur, ainsi que le largeur maximale autorisée pour la colonne, sera associée à cela . Comme mentionné, la valeur peut être donnée sous la forme de caractères. Dans le Si la largeur est signalée en caractères, cela signifie que la sémantique de la longueur des caractères fonctionne pour la colonne. Sinon le la largeur sera indiquée en octets. Essentiellement, cette erreur résulte de essayer de faire passer une valeur, ou un ensemble de valeurs, qui dépasse le largeur maximale spécifiée de la colonne. Alors, comment un utilisateur corrige-t-il ce type d'erreur?

LA SOLUTION

Pour commencer, ouvrez l'utilitaire OERR. L'utilisateur aura besoin de l'intégralité du fichier Message ORA-12899 pour recevoir le retour d'informations correct sur l'erreur. Ce fournira plus d'informations sur l'erreur et autorisera davantage enquête. En règle générale, l'erreur peut provenir de l'un des trois sources. La première source est les instructions SQL qui ont été généré. Vérification des types de données de colonne source et de destination sur Découvrez si elles sont compatibles avec les formats actuels est le deuxième source. Enfin, l'utilisateur peut consulter la colonne de destination width - où la valeur est assignée - pour s’assurer qu’elle est grande assez pour tenir compte de la valeur maximale que l'utilisateur anticipe attribution. Passons maintenant à un exemple qui corrige ORA-12899 . Supposons que l'utilisateur ait créé le tableau suivant:

CREATE TABLE Clients(
ClientID varchar2(9) PRIMARY KEY,
Client_Contact varchar2(40) NOT NULL,
Address varchar(20) NOT NULL,
Zip varchar2(5) NOT NULL,
Client_Number varchar2(11) NOT NULL)

L'utilisateur tente ensuite d'émettre une instruction INSERT VALUES qui ressemble à quelque chose comme ça:

INSERT INTO Clients VALUES(
727546345,
‘Roger Holcomb’,
‘—Benjamin Road Syracuse’,
‘-----‘, 05307623754)

L'utilisateur peut essayer d'exécuter l'instruction à partir d'ici, mais recevra le message d'erreur suivant:

Erreur de démarrage à la ligne 7 de la commande: INSERT INTO Clients VALUES (727546345, «Ricky Galorey», «18 Benjamin Road Syracuse», «13208», 05307623754) Rapport d’erreur: erreur SQL: ORA-12899: valeur également grand pour la colonne «ORGANISATIONS». "MARCHÉ". “ADRESSE” (valeur réelle: 25, Maximum: 20) 12899. 00000 - “valeur trop grande pour la colonne% s (valeur réelle: % S, maximum:% s)”

Cette déclaration d'erreur indique que la variable ‘Address’ ne peut contenir plus de vingt caractères car cela dépasserait la largeur du paramètre de colonne. Si nous revenons à la valeur de l’adresse (’18 Benjamin Road Syracuse ’), nous pouvons voir que le nombre total de caractères (25) dépasse le nombre maximum autorisé pour la largeur de la colonne. À corrigez cela, l’utilisateur peut changer le VARCHAR2 pour adresse en un montant pouvant accueillir la longueur d’adresse typique que leur société entrerait.

L'URL d'origine de la réponse ci-dessus

0
Gehan Fernando

En raison de paramètres NLS différents dans la base de données de la table cible, il peut être nécessaire d'ajouter plus d'octets dans la cible . Essayez de modifier la table en alter Table1 modify column1 varchar2 (30 caractères)

0
lakshmi tatavarty