(不是4079956的重复)
我有一个SQL_ASCII
数据库,LC_CTYPE
= LC_COLLATION
= "C"
,其中主要包含ASCII数据以及某些代码页中的一些非ASCII字符,例如{ {1}}。
我想转码,就地(无LATIN1
/ pg_dump
),从pg-restore
代码页到UTF-8的所有非ASCII代码点然后将数据库编码更改为UTF-8,例如:
LATIN1
或
-- 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';
后,应关闭并重新打开与数据库的所有连接,以便后端考虑新的编码还有别的吗?
答案 0 :(得分:2)
看起来你已经掌握了它的主要内容。我假设你已经用测试数据库试过了吗?我向某人建议时给它做了一个快速测试,它对我来说似乎没问题,虽然这远非彻底的测试。
我的直觉是首先进行转码并在之后更改编码,因为虽然数据库仍在SQL_ASCII中,但您不必处理postgresql中的错误,试图解释尚未转码或转换不正确的数据,并且可以查看相对有罪不罚的数据。 OTOH更改编码首先保证只有后续连接后端才能以UTF8 ...
写入数据还要检查可能需要转码的函数体,视图定义,约束定义等内容吗? (你不希望,但......)