我在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;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。