web-dev-qa-db-ger.com

ORA-12899-Wert für Spalte trotz gleicher Länge zu groß

Ich führe die folgende Abfrage aus. Aber ORA-12899 bekommen. Die Länge der Zeichenfolge, die versucht wird, ist 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

Sie sehen den Unterschied zwischen Zeichen- und Bytelängensemantik :

Sie müssen eine maximale Länge für eine VARCHAR2-Spalte angeben. Dieses Maximum muss mindestens 1 Byte betragen, obwohl die tatsächlich gespeicherte Zeichenfolge eine Zeichenfolge mit der Länge Null ('') sein darf. Sie können das CHAR-Qualifikationsmerkmal verwenden, z. B. VARCHAR2 (10 CHAR), um die maximale Länge in Zeichen anstelle von Bytes anzugeben. Ein Zeichen ist technisch gesehen ein Codepunkt des Datenbankzeichensatzes. Sie können das BYTE-Qualifikationsmerkmal, beispielsweise VARCHAR2 (10 BYTE), verwenden, um die maximale Länge in Byte explizit anzugeben. Wenn beim Erstellen eines Datenbankobjekts mit dieser Spalte oder diesem Attribut kein explizites Qualifikationsmerkmal in einer Spalten- oder Attributdefinition enthalten ist, wird die Längensemantik durch den Wert des Parameters NLS_LENGTH_SEMANTICS der Sitzung bestimmt, die das Objekt erstellt.

Wenn Ihre Sitzung Bytesemantik verwendet, lautet die Standardspalte in Ihrer Tabelle wie folgt:

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

Das ist das Gleiche wie explizit:

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

Wenn Ihre Quelldaten aus fünf Zeichen bestehen, jedoch Multibyte-Zeichen enthalten, überschreitet die Anzahl der Bytes fünf:

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)

Welches ist, was Sie sehen. Wenn Sie die Werte aus Ihrer anderen Tabelle einfügen, filtern Sie nach der Länge der Werte, aber length() zählt die Zeichen und nicht die Bytes. Es gibt eine lengthb() -Funktion, die Bytes zählt. Wenn Sie die Bytelänge des 30-Zeichen-Werts überprüfen, den Sie auswählen, sehen Sie, dass es sich tatsächlich um 31 Bytes handelt. Eines dieser Zeichen ist also Multibyte.

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

Aus den dump() Werten können Sie ersehen, dass nach Testing (54,65,73,74,69,6e,67) Und vor dem Leerzeichen und Bindestrich (20,2d) c2,a0, das ist das nicht unterbrechende UTF-8-Multibyte-Leerzeichen . (Sie sehen dies häufig, zusammen mit geschweiften Anführungszeichen und anderen Zeichen außerhalb des ASCII-Bereichs, in Text, der beispielsweise aus einem Word-Dokument kopiert wurde.).

Sie können entweder Ihre Einfügung so ändern, dass sie nach LENGTHB(column1)=30 filtert (wodurch die aktuell gefundene Zeile ausgeschlossen wird), oder Ihre Spaltendefinition in 30 Zeichen anstelle von 30 Bytes ändern:

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.

Oder ersetzen Sie unerwartete Multibyte-Zeichen durch Einzelbyte-Entsprechungen, wenn dies möglich und für Ihre Daten sinnvoll ist. In diesem Fall könnte ein normales Leerzeichen funktionieren , aber mit jeder Ersetzung zerstören Sie Informationen, die tatsächlich wichtig sein könnten.

9
Alex Poole

Versuchen Sie, Ihren Tisch zu ändern

ALTER TABLE1 MODIFY column1 VARCHAR2(30 CHAR)

Der Fehler gibt an, dass Ihre column1 maximal 30 Zeichen speichern kann und Sie mehr als 30 Zeichen übergeben, was zu dem Fehler führt.

Sie können sich auch auf diesen Artikel beziehen: Oracle Database - Bytes oder Zeichen für VARCHAR2 und CHAR

2
Rahul Tripathi

ORA-12899

Oft, wenn unsere Unternehmen als Antwort auf eine .__ wachsen und sich weiterentwickeln. Expansion in Form von Kundenstamm, Mitarbeitern, Gewinn oder Märkten, der Die mit diesem Wachstum verbundenen Daten ändern sich ebenfalls. Datensysteme wie Oracle hat die angeborene Fähigkeit, in Bezug auf .__ ziemlich flexibel zu bleiben. mit dieser Informationsvarianz arbeiten. Trotzdem auch die meisten vielseitige Datenbanksysteme erfordern Wartung und Verfeinerung in der Angesichts des erhöhten Datenverkehrs. Diese Arbeit ist wichtig für Berücksichtigung von Speicherbeschränkungen oder erforderlichen Neudefinitionen von Parameter. Der Fehler ORA-12899 ist repräsentativ für eine Instanz in der entweder ein Uptick in Daten oder ein Benutzerfehler zwingt Oracle zu Stand während der angeforderten Aktion.

DAS PROBLEM

Der ORA-12899 ist ein Oracle-Fehler, der bei Eingabe des Werts .__ auftritt. in die Spaltenzeichenfolge ist zu groß. Was dies bedeutet, ist ein Der Benutzer hat versucht, eine Spalte mit dem Wert .__ zu aktualisieren oder einzufügen. das ist zu breit für die Zielspalte. Der Name eines bestimmten Spalte wird angegeben und die tatsächliche Breite des Werts sowie die Die maximal zulässige Breite für die Spalte wird mit dem ..__ verknüpft. Wie bereits erwähnt, kann der Wert in Form von Zeichen angegeben werden. In dem Wenn die Breite in Zeichen angegeben wird, bedeutet dies, dass Zeichenlängensemantik funktioniert für die Spalte. Ansonsten der width wird in Bytes angegeben. Im Wesentlichen resultiert dieser Fehler aus Es wird versucht, einen Wert oder eine Menge von Werten durchzusetzen, die größer als .__ sind. angegebene maximale Breite der Spalte. Wie korrigiert ein Benutzer diese Art von Fehler?

DIE LÖSUNG

Öffnen Sie zunächst das Dienstprogramm OERR. Der Benutzer benötigt das vollständige ORA-12899-Nachricht, um die richtige Rückmeldung zum Fehler zu erhalten. Diese liefert weitere Informationen zum Fehler und lässt weitere Ermittlung. In der Regel kann der Fehler von einer von drei Ursachen kommen. Quellen. Die erste Quelle sind die SQL-Anweisungen, die .__ waren. generiert. Überprüfen der Quell- und Zielspaltendatentypen auf herauszufinden, ob sie mit aktuellen Formaten kompatibel sind, ist die zweite Quelle. Zuletzt kann der Benutzer die Zielspalte anzeigen width - wo der Wert zugewiesen wird - um sicherzustellen, dass er groß ist genug, um den maximalen Wert aufzunehmen, den der Benutzer erwartet Zuweisung Wenden wir uns nun einem Beispiel zu, das den ORA-12899 ..__ korrigiert. Angenommen, der Benutzer hat die folgende Tabelle erstellt:

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)

Der Benutzer versucht dann, eine INSERT VALUES-Anweisung auszugeben, die wie folgt aussieht etwas wie das:

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

Der Benutzer kann versuchen, die Anweisung von hier aus auszuführen, erhält jedoch die folgende Fehlermeldung:

Fehler bei Zeile 7 im Befehl: INSERT INTO-Clients VALUES (727546345, "Ricky Galorey", "18 Benjamin Road Syracuse", "13208", 05307623754) Fehlerbericht: SQL-Fehler: ORA-12899: Wert auch groß für Spalte "ORGANISATIONS". "MARKT". "ADDRESS" (aktuell: 25, Maximum: 20) 12899. 00000 - "Wert für Spalte% s zu groß (tatsächlich: % S, Maximum:% s)"

Diese Fehleranweisung gibt an, dass die Variable 'Address' nicht enthalten kann mehr als zwanzig Zeichen, da dies die Breite von .__ überschreiten würde. Spaltenparameter. Wenn wir uns den Adresswert ansehen (´18 Benjamin Road Syracuse ’), sehen wir die Gesamtzahl der Zeichen (25) überschreitet die maximal zulässige Anzahl für die Breite der Spalte. Zu Korrigieren Sie dies, der Benutzer kann die VARCHAR2-Adresse in eine .__ ändern. Betrag, der die typische Adresslänge aufnehmen kann, die ihre Firma würde eingeben.

Die obige Antwort ursprüngliche URL

0
Gehan Fernando

Aufgrund unterschiedlicher NLS-Einstellungen in der Zieltabellendatenbank sind möglicherweise mehr Bytes im Ziel erforderlich. __ Versuchen Sie, die Tabelle als .__ zu ändern. ändern Sie Tabelle1 Ändern Sie Spalte1 Varchar2 (30 Zeichen)

0