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:
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:
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.
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.
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
Tags und Links oracle character-encoding utf-8 unicode