【发布时间】:2011-03-10 20:04:34
【问题描述】:
(不是4079956的重复)
我有一个SQL_ASCII 数据库,LC_CTYPE=LC_COLLATION="C",其中主要包含 ASCII 数据以及来自某些代码页的一些非 ASCII 字符,例如 LATIN1。
我想就地(没有pg_dump/pg-restore)将LATIN1代码页中的所有非ASCII代码点转码为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更新后,所有与数据库的连接都应关闭并重新打开,以便后端考虑新的编码 - 应重建基于更改列的所有索引
还有什么?
【问题讨论】:
标签: postgresql unicode internationalization