将Postgresql数据库从SQL_ASCII就地转换为UTF8

时间:2011-03-10 20:04:35

标签: postgresql unicode internationalization

(不是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'; 后,应关闭并重新打开与数据库的所有连接,以便后端考虑新的编码
  • 应重建基于更改列的所有索引

还有别的吗?

1 个答案:

答案 0 :(得分:2)

看起来你已经掌握了它的主要内容。我假设你已经用测试数据库试过了吗?我向某人建议时给它做了一个快速测试,它对我来说似乎没问题,虽然这远非彻底的测试。

我的直觉是首先进行转码并在之后更改编码,因为虽然数据库仍在SQL_ASCII中,但您不必处理postgresql中的错误,试图解释尚未转码或转换不正确的数据,并且可以查看相对有罪不罚的数据。 OTOH更改编码首先保证只有后续连接后端才能以UTF8 ...

写入数据

还要检查可能需要转码的函数体,视图定义,约束定义等内容吗? (你不希望,但......)