加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

如何在PostgreSQL中修复双重编码?

发布时间:2020-12-13 16:07:12 所属栏目:百科 来源:网络整理
导读:我在PostgreSQL中有一个带有单词的表,但有些单词的UTF-8字符无效,如0xe7e36f和0xefbfbd. 如何识别无效单词中的所有字符,并用一些符号替换它们? 编辑:我的数据库是UTF-8,但我认为有其他各种编码的双重编码.我想这是因为当我尝试将一种类型转换为LATIN1时,我
我在PostgreSQL中有一个带有单词的表,但有些单词的UTF-8字符无效,如0xe7e36f和0xefbfbd.

如何识别无效单词中的所有字符,并用一些符号替换它们?

编辑:我的数据库是UTF-8,但我认为有其他各种编码的双重编码.我想这是因为当我尝试将一种类型转换为LATIN1时,我得到一个错误,说该编码中不存在某些字符,当我更改为LATIN2时,我得到了
相同的错误,但与另一个字符.

那么,有什么可以解决这个问题呢?

解决方法

用法

这是我的具体案例的解决方案,但也许有一些修改可以帮助其他人.

用法

SELECT fix_wrong_encoding(‘LATIN1’);

功能

-- 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;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读