gpt4 book ai didi

sql - 如何修复 PostgreSQL 中的双重编码?

转载 作者:行者123 更新时间:2023-11-29 11:25:50 25 4
gpt4 key购买 nike

我在 PostgreSQL 中有一个包含单词的表,但有些单词具有无效的 UTF-8 字符,例如 0xe7e36f0xefbfbd

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

编辑:我的数据库是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;

关于sql - 如何修复 PostgreSQL 中的双重编码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8185915/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com