(不是 4079956 的副本)
我有一个 SQL_ASCII
数据库,LC_CTYPE
=LC_COLLATION
="C"
,其中主要包含 ASCII 数据以及来自某些代码页的一些非 ASCII 字符,例如 LATIN1
。
我想转码,就地(没有pg_dump
/pg-restore
),中的所有非ASCII代码点>LATIN1
codepage 到 UTF-8,然后将数据库编码更改为 UTF-8,例如:
-- change encoding first, transcode data after
UPDATE pg_database SET encoding=pg_char_to_encoding('UTF8')
WHERE datname='sqlasciidb';
UPDATE tbl SET str=convert_from(str::bytea, 'LATIN1')
WHERE str::bytea<>convert_from(str::bytea, 'LATIN1')::bytea;
或
-- transcode data first, change encoding after
CREATE DOMAIN my_varlena AS bytea;
CREATE CAST (my_varlena AS text) WITHOUT FUNCTION;
UPDATE tbl SET str=convert(str::bytea, 'LATIN1','UTF8')::my_varlena::text
WHERE str::bytea<>convert(str::bytea, 'LATIN1', 'UTF8');
DROP DOMAIN my_varlena CASCADE;
UPDATE pg_database SET encoding=pg_char_to_encoding('UTF8')
WHERE datname='sqlasciidb';
上述方法有什么问题?
我能看到的一些问题:
pg_database
更新后,所有与数据库的连接都应该关闭并重新打开,以便后端考虑新的编码- 应重建基于更改列的所有索引
还有什么吗?
最佳答案
看来您已经掌握了主要内容。我假设你已经用测试数据库试过了?在向某人推荐它时,我确实对其进行了快速测试,它似乎对我来说工作正常,尽管这远非彻底的测试。
我的直觉是先转码,然后再更改编码,因为当数据库仍在 SQL_ASCII 中时,您将不必处理 postgresql 试图解释尚未转码或不正确转码的数据的错误,并且可以相对不受惩罚地查看数据。 OTOH 首先更改编码保证只有随后连接的后端才会以 UTF8 写入数据...
还要检查函数体、 View 定义、约束定义等可能也需要转码的内容吗? (你希望不会,但是......)
关于postgresql - 将 Postgresql 数据库从 SQL_ASCII 就地转换为 UTF8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5265256/