如何在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; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |