如何修复PostgreSQL中的双重编码?
我在PostgreSQL中有一个包含单词的表,但有些单词有无效的UTF-8字符,如如何修复PostgreSQL中的双重编码?,sql,postgresql,encoding,utf-8,Sql,Postgresql,Encoding,Utf 8,我在PostgreSQL中有一个包含单词的表,但有些单词有无效的UTF-8字符,如0xe7e36f和0xefbfbd 如何识别单词中所有无效的字符,并将其替换为一些符号,如? 编辑:我的数据库在UTF-8中,但我认为有来自各种其他编码的双重编码。我想这是因为当我试图转换成一种类型为LATIN1时,我得到一个错误,当我改成LATIN2时,该编码中不存在一些字符 相同的错误,但有另一个字符 那么,如何解决这个问题呢? 这是针对我的具体情况的解决方案,但也许经过一些修改可以帮助其他人 用法 选择修复错
0xe7e36f
和0xefbfbd
如何识别单词中所有无效的字符,并将其替换为一些符号,如?
编辑:我的数据库在UTF-8
中,但我认为有来自各种其他编码的双重编码。我想这是因为当我试图转换成一种类型为LATIN1
时,我得到一个错误,当我改成LATIN2
时,该编码中不存在一些字符
相同的错误,但有另一个字符
那么,如何解决这个问题呢?
这是针对我的具体情况的解决方案,但也许经过一些修改可以帮助其他人
用法
选择修复错误编码(“拉丁1”)代码>
作用
你能取出原始字节并运行它们吗?Iconv有很多处理混乱编码的选项。这就是我要做的。错误的行很可能是双重编码的结果。当编码在每行的基础上发生变化时,事情就会变得一团糟。在大多数情况下,我的第一步是转储到ascii并对其进行排序。@wildplasser查看我的编辑,我认为这是双重编码的问题。@muistooshort查看我的编辑。看起来像是双重编码。我想不出有什么办法让Postgres允许您在UTF-8编码的数据库中插入无效的UTF-8序列
-- Convert words with wrong encoding
CREATE OR REPLACE FUNCTION fix_wrong_encoding(encoding_name VARCHAR)
RETURNS VOID
AS $$
DECLARE
r RECORD;
counter INTEGER;
token_id INTEGER;
BEGIN
counter = 0;
FOR r IN SELECT t.id, t.text FROM token t
LOOP
BEGIN
RAISE NOTICE 'Converting %', r.text;
r.text := convert_from(convert_to(r.text,encoding_name),'UTF8');
RAISE NOTICE 'Converted to %', r.text;
RAISE NOTICE 'Checking existence.';
SELECT id INTO token_id FROM token WHERE text = r.text;
IF (token_id IS NOT NULL) THEN
BEGIN
RAISE NOTICE 'Token already exists. Updating ids in textblockhastoken';
IF(token_id = r.id) THEN
RAISE NOTICE 'Token is the same.';
CONTINUE;
END IF;
UPDATE textblockhastoken SET tokenid = token_id
WHERE tokenid = r.id;
RAISE NOTICE 'Removing current token.';
DELETE FROM token WHERE id = r.id;
END;
ELSE
BEGIN
RAISE NOTICE 'Token don''t exists. Updating text in token';
UPDATE token SET text = r.text WHERE id = r.id;
END;
END IF;
EXCEPTION WHEN untranslatable_character THEN
--do nothing
WHEN character_not_in_repertoire THEN
--do nothing
END;
counter = counter + 1;
RAISE NOTICE '% token converted', counter;
END LOOP;
END
$$
LANGUAGE plpgsql;