2017-03-03 2 views
0

Ich habe versucht, Daten in Tabelle mit SQL Loader zu laden.SQL Loader - Tatsächliche Länge überschreitet Maximum

Das Protokoll zeigt tatsächliche Länge der Saite 101, wo als 100 maximal ist (die Aufzeichnung Lehnt) .Aber wenn i, geprüft fand ich die Länge 99.

Datentyp der Zeichenfolge varchar2 (100 in Tabelle)

habe ich nicht etwas über Länge in Steuerdatei

angeben Was genau das Problem sein?

+1

Gibt es Multibyte-Zeichen in der Zeichenfolge, und die Spalte wird als 100 Byte statt 100 Zeichen definiert? Andernfalls müssten Sie uns die Daten zeigen. –

+0

½ ist das ein Multibyte-Charakter? Ich fand diesen Char auf abgelehnten Aufzeichnungen. Können Sie sich ausführlich mit Multibyte-Charakteren beschäftigen? – Joe1

Antwort

3

Ihr Datenwert hat nur 99 Zeichen, aber es scheint, einige sind multibyte characters - von einem Kommentar mindestens eins ist das Symbol .

Es gibt zwei verwandte Möglichkeiten, dieses Verhalten zu sehen, abhängig davon, wie Ihre Tabelle definiert ist und was in Ihrer Steuerdatei enthalten ist.

Sie sehen wahrscheinlich den Effekt von character length semantics. Ihre Spalte ist definiert als 100 Bytes; Sie versuchen, 99 Zeichen einzufügen, aber da einige Zeichen mehrere Bytes für den Speicher benötigen, ist die Gesamtzahl der für Ihre Zeichenfolge erforderlichen Bytes 101 - zu viele für die Spaltendefinition.

Sie hier diesen Effekt sehen:

create table t42 (str varchar2(10 byte)); 

Dann, wenn ich eine Datendatei mit einer Zeile, die einen Multibyte-Charakter hat:

This is 10 
This is 9½ 

und eine einfache Steuerdatei:

LOAD DATA 
CHARACTERSET UTF8 
TRUNCATE INTO TABLE T42 
FIELDS TERMINATED BY ',' 
TRAILING NULLCOLS 
(
    STR 
) 

Dann versucht zu laden, dass bekommt:

Record 2: Rejected - Error on table T42, column STR. 
ORA-12899: value too large for column "MYSCHEMA"."T42"."STR" (actual: 11, maximum: 10) 

Total logical records read:    2 
Total logical records rejected:   1 

Wenn ich meine Tabelle mit Charakter Semantik neu:

drop table t42 Entlüfter; create table t42 (str varchar2 (10 char));

dann mit der gleichen Daten und Steuerdatei geladen wird jetzt keine Fehler, und:

Total logical records read:    2 
Total logical records rejected:   0 

Wenn jedoch auch die Tabelle mit Zeichen Semantik definiert ist, können Sie immer noch die sehen können; wenn ich die Linie CHARACTERSET UTF8 dann meine Umgebung Standardwerte (über NLS_LANG, die meinen Charakter zu WE8ISO8859P1 gesetzt setzen geschieht) entfernen führt zu einem Zeichensatz Mismatch und ich wieder sehen:

Record 2: Rejected - Error on table T42, column STR. 
ORA-12899: value too large for column "STACKOVERFLOW"."T42"."STR" (actual: 11, maximum: 10) 

(Ohne diese Steuerdatei Leitung und Bei Bytesemantik für die Spalte gibt der Fehler die tatsächliche Länge als 13 nicht 11) an.

So müssen Sie die Tabelle definiert werden, um die maximale Anzahl von Zeichen halten Sie erwarten, und Sie die Steuerdatei müssen den Zeichensatz angeben, ob Ihr NLS_LANG es um etwas in Verzug, die nicht übereinstimmt der Datenbankzeichensatz.


Sie die Standard-Semantik eine neue Tabelle für die Datenbank Standard und die aktuelle Sitzung Standard durch Abfragen, erhalten sehen:

select value from nls_database_parameters where parameter = 'NLS_LENGTH_SEMANTICS'; 
select value from nls_session_parameters where parameter = 'NLS_LENGTH_SEMANTICS'; 

Für eine vorhandene Tabelle können Sie überprüfen, die von der Suche verwendet wurde an der user_tab_columns.char_used Spalte, die B für Byte-Semantik und C für Zeichensemantik sein wird.

+0

Danke Alex! Ich habe 3 abgelehnte Datensätze aus diesem zwei Datensatz hat ½. Ich überprüft lengthb (str) für diese beiden Datensätze zeigte es 102 byted.Ich entfernte die ½ und versuchte das Laden von Daten wurde erfolgreich geladen .. wo, wie wenn ich überprüfe den dritten Datensatz es hat kein spezielles character.lengthb (dritter Datensatz) gibt 100 Bytes ... was wird der Grund für die Ablehnung des dritten Datensatzes sein? – Joe1

+0

Ich weiß nicht, welchen Fehler hat das in der SQL \ * Loader-Protokolldatei bekommen? –

+0

ORA-12899: Wert zu groß für Spalte (tatsächlich: 101, maximal: 100) – Joe1

Verwandte Themen