レガシーの理由から、Oracle 10データベースには、文字エンコードが設定されているVARCHAR2列があり、AL32UTF8
UTF-8以外の値が含まれています。値は常に次のいずれかの文字セットに含まれます。
- US-ASCII
- UTF-8
- CP1252
- ラテン-1
私はデータベースの外で壊れた値を修正するためにPerl関数を書きました。このデータベース列の値については、このエンコーディングのリストをループし、値をUTF-8に変換しようとします。変換が失敗した場合、次のエンコードを試みます。エラーなしで最初に変換するのは、保持する値です。ここで、この機能をデータベース内に複製して、誰でも使用できるようにしたいと思います。
ただし、これについて私が見つけることができるのは、CONVERT
関数であり、失敗することはありませんが、認識できない文字の代わりに文字を挿入します。したがって、私が知る限り、変換がいつ失敗したかを知る方法はありません。
そのため、2つの質問があります。
- 文字列をエンコーディングのリストの1つに変換して、成功した最初のインターフェイスを返す既存のインターフェイスはありますか?
- そうでない場合は、文字列をエンコーディングに変換できない場合に失敗を示す他のインターフェイスはありますか?もしそうなら、私は前の関数を書くことができます。
アップデート:
参考までに、私はこのPostgreSQL関数をPL / pgSQLで記述しました。これは、必要なことを正確に実行します。
CREATE OR REPLACE FUNCTION encoding_utf8(
bytea
) RETURNS TEXT LANGUAGE PLPGSQL STRICT IMMUTABLE AS $$
DECLARE
encoding TEXT;
BEGIN
FOREACH encoding IN ARRAY ARRAY[
'UTF8',
'WIN1252',
'LATIN1'
] LOOP
BEGIN
RETURN convert_from($1, encoding);
EXCEPTION WHEN character_not_in_repertoire OR untranslatable_character THEN
CONTINUE;
END;
END LOOP;
END;
$$;
Oracleで同等の方法を実行する方法を知りたいと思います。