ORA-29275: teilweise multibyte-Zeichen
Habe ich input-Daten aus einer flachen Datei, die hat englische, japanische, chinesische Zeichen in einer Spalte.
Ich bin laden Sie diese Werte in eine staging-Tabelle-Spalte, deren schema definition VARCHAR2(250 CHAR), die Haupt-Tabelle, die Spalte definition VARCHAR2(250), DIE ich nicht ändern kann.
Also, ich bin dabei ein SUBSTR auf diese Spalte. Nach dem laden der Tabelle wenn ich
SELECT * FROM TABLE
...Ich bekomme diese Fehlermeldung :
ORA-29275: teilweise multibyte-Zeichen -
Wenn ich wählen Sie die anderen Spalten dann keine Probleme.
InformationsquelleAutor Walker | 2009-12-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
sollten Sie verwenden
SUBSTRB
beim kopieren Ihrer Daten von Ihrem250 CHAR
Spalte250 byte
Spalte. Diese Funktion wird nur für die Ausgabe ganzer Zeichen (wirst du nicht bekommen unvollständige unicode-Zeichen):Edit:
@mwardm machte eine interessante Bemerkung über die tatsächliche Länge des resultierenden Strings und ob die resultierende Zeichenfolge enthalten könnte eine ungültige Byte-Reihenfolge. Betrachten Sie den folgenden Befehl auf einem AL32UTF8 DB:
Wie Sie sehen können, das Letzte byte des
substrb
string wird nicht abgeschnitten, erste byte des speziellen Charakter, sondern kodiert für ein legit-Zeichen (Die ersten 128 Zeichen in diesem Zeichensatz sind die gleichen wie die ASCII7US Zeichen setzen, damit diese wiederum die' '
Leerzeichen mit RTRIM wie vorgeschlagen in einer anderen Antwort wird entfernt das Letzte Zeichen).Darüber hinaus, habe ich mir auch dieses interessante Ergebnis mit dem Zeichensatz AL16UTF16:
In diesem Fall Oracle ausgewählt hat, um Schnitt die Schnur, nachdem das zweite byte übertragen, weil im Zeichensatz AL16UTF16 es gibt keine legit ein-byte-Zeichen. Die resultierende Zeichenfolge wird nur 2 bytes statt 3.
Dies müssten weitere Tests und es wird nicht bedeuten, eine strenge demonstration, aber ich immer noch stehe zu meiner ersten Vermutung, dass
substrb
gibt eine gültige Sequenz von bytes kodiert, dass eine gültige Zeichenfolge von Zeichen.die Spalte werden abgeschnitten, ein
250 CHAR
Spalte möglicherweise haben können, so viel wie 1000 bytes der Daten, passt es nicht in eine250 byte
Spalte. Die Funktion schneidet nicht ein UTF-8 Zeichen in der Hälfte jedoch: das Ergebnis wird immer eine rechtliche UTF-8-string.Scheint nicht wahr zu sein, dass Sie nicht schneiden Sie ein Charakter in der Hälfte - wenn Sie wickeln Sie ein lengthb um Ihre ch8 und ch7 Spalten, dann würde ich Wetten, dass Sie dabei sind, 8 und 7 jeweils. (In 11g sowieso.) Ich vermute, dass, wahrscheinlich durch die geschickte Art, wie Sie definiert die Zeichenkodierung, die teilweise den Charakter in der Regel einfach nicht druckbare und so ignoriert wird.
... [Ich habe einen vagen plan, zu versuchen, richtig zu trimmen, das ungerade byte aus durch, nach der substrb, mit einem (Charakter-basiert) Länge (die vermutlich ignorieren der ungeraden byte-zu) und dann Charakter-basierte substr-inging auf diese Länge.... aber hey, es ist nur über das Wochenende, und diese Frage ist immer für seine zwei-Jahres-Jubiläum!]
das ist interessant, ich hätte nicht gedacht, dass die Ausgabe könnte eine ungültige Zeichenfolge von bytes (seit dem ist es varchar2) aber richtig angezeigt werden. Ich don ' T haben Zugriff auf eine Datenbank jetzt, aber ich werde mal schauen, wenn ich kann (nicht dieses Wochenende, wahrscheinlich aber nicht 🙂
InformationsquelleAutor Vincent Malgrat
Ich glaube ich habe gefunden ein guter Weg, es zu tun
wenn Sie
rtrim(substrb('中华人', 1, 8))
erhalten Sie'中华'
und eine byte-Länge der erwarteten 6bitte versuchen
InformationsquelleAutor Stefan U7
Mit substr wird sich anders Verhalten, je nach dem Datenbank-Zeichensatz. Ich nehme an, aus deiner Beschreibung, dass Ihre DB-Zeichensatz ist nicht eine der Unicode-Varianten, und Sie müssen Sie abschneiden, varchar2(250 char) Daten zu 250 BYTES oder weniger. Dies ist gefährlich, weil es kann zu stoppen in der Mitte einer 2-byte-Zeichen, was in der Nachricht, die Sie bekam. Sollten Sie sich die Dokumentation für substrc(), die Berechnung seiner Länge, basierend auf Zeichen und nicht in bytes.
Könnte es helfen, wenn du mehr dazu erklären, warum Sie erforderlich sind, um Sie wegzuwerfen Teil der Daten.
InformationsquelleAutor Jim Garrison