由于遗留原因,我们在 Oracle 10 数据库中有一个 VARCHAR2 列(其中字符编码设置为),其中AL32UTF8
包含一些非 UTF-8 值。这些值始终位于以下字符集中之一:
- 美国ASCII
- UTF-8
- CP1252
- 拉丁语-1
我编写了一个 Perl 函数来修复数据库外的损坏值。对于此数据库列中的值,它会遍历此编码列表并尝试将值转换为 UTF-8。如果转换失败,它会尝试下一个编码。第一个无误转换的是我们保留的值。现在,我想在数据库中复制此功能,以便任何人都可以使用它。
但是,我能找到的只是这个CONVERT
函数,它永远不会失败,但会为它无法识别的字符插入一个替换字符。因此,据我所知,无法知道转换何时失败。
因此,我有两个问题:
- 是否有一些现有的接口试图将字符串转换为编码列表之一,返回第一个成功的?
- 如果没有,如果它不能将字符串转换为编码,是否有其他接口指示失败?如果是这样,那么我可以编写前面的函数。
更新:
作为参考,我在 PL/pgSQL 中编写了这个 PostgreSQL 函数,它完全符合我的需要:
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 中做同样的事情。