Wie kann ich Oracle VARCHAR2-Werte aus einer Liste möglicher Kodierungen in UTF-8 konvertieren?

8

Aus älteren Gründen haben wir in unserer Oracle 10-Datenbank eine VARCHAR2-Spalte, in der die Zeichencodierung auf AL32UTF8 gesetzt ist, die einige Nicht-UTF-8-Werte enthält. Die Werte befinden sich immer in einem dieser Zeichensätze:

  • US-ASCII
  • UTF-8
  • CP1252
  • Lateinisch-1

Ich habe eine Perl-Funktion geschrieben, um defekte Werte außerhalb der Datenbank zu korrigieren. Bei einem Wert aus dieser Datenbankspalte wird diese Liste von Codierungen durchsucht und der Wert in UTF-8 konvertiert. Wenn die Konvertierung fehlschlägt, versucht es die nächste Codierung. Die erste, die ohne Fehler konvertiert wird, ist der Wert, den wir behalten. Jetzt möchte ich diese Funktionalität in der Datenbank replizieren, so dass jeder sie verwenden kann.

Aber alles, was ich dafür finden kann, ist die CONVERT Funktion , die niemals fehlschlägt, aber ein Ersatzzeichen für Zeichen einfügt, das sie nicht erkennt. Daher kann ich, soweit ich es beurteilen kann, nicht wissen, wann die Konvertierung fehlgeschlagen ist.

Dafür habe ich zwei Fragen:

  1. Gibt es eine vorhandene Schnittstelle, die versucht, eine Zeichenfolge in eine Liste von Codierungen zu konvertieren und die erste, die erfolgreich ist, zurückgibt?
  2. Und wenn nicht, gibt es eine andere Schnittstelle, die einen Fehler anzeigt, wenn es nicht in der Lage ist, eine Zeichenfolge in eine Codierung zu konvertieren? Wenn ja, könnte ich die vorherige Funktion schreiben.

UPDATE:

Als Referenz habe ich diese PostgreSQL-Funktion in PL / pgSQL geschrieben, die genau das tut, was ich brauche:

%Vor%

Ich würde liebend gerne wissen, wie man das Äquivalent in Oracle macht.

    
theory 03.10.2012, 21:45
quelle

2 Antworten

6

Dank der Schlüsselinformationen über die illegalen Zeichen in UTF-8 von @collapsar, sowie einige Grabungen durch einen Mitarbeiter, habe ich folgendes herausgefunden:

%Vor%

Seltsamerweise kommt es nie zu WE8ISO8859P1: WE8MSWIN1252 konvertiert jede einzelne der Liste von 800 oder so schlechten Werten, die ich ohne Beanstandung habe. Dasselbe gilt nicht für meine Perl- oder PostgreSQL-Implementierungen, bei denen CP1252 für einige Werte fehlschlägt, aber ISO-8859-1 erfolgreich ist. Trotzdem scheinen die Werte von Oracle angemessen zu sein und scheinen Unicode zu sein (getestet, indem sie in PostgreSQL geladen werden), also kann ich mich nicht beschweren. Das wird gut genug sein, um meine Daten zu bereinigen, denke ich.

    
theory 10.10.2012, 00:15
quelle
2

Um zu überprüfen, ob Ihre Datenbankspalte ungültige UTF-8 enthält, verwenden Sie die folgende Abfrage:

%Vor%

vorausgesetzt, dass Ihr db-Zeichensatz al32utf8 ist.

Beachten Sie, dass EF BF BD eine unzulässige Codierung in utf-8 .

Da alle anderen von Ihnen angegebenen Zeichensätze Byte-orientiert sind, wird die Umwandlung in Unicode niemals fehlschlagen, aber möglicherweise unterschiedliche Codepunkte erzeugen. ohne kontextuelle Information ist eine automatische Ermittlung des Quellcodes nicht möglich.

Beste Grüße, carsten

ps: Oracle-Namen für Zeichensätze: CP1252 - & gt; %Code% WE8MSWIN1252 - & gt; LATIN-1

    
collapsar 09.10.2012 11:47
quelle