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

标签 postgresql unicode internationalization

(不是 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/

相关文章:

postgresql - 选择整数返回函数结果到变量 postgres

java - Dropwizard 应用程序中 Postgres 的自动增量

unicode - 为什么我们所做的一切都不是 Unicode?

internationalization - vue-i18n 中的动态本地化

ruby-on-rails - 如何在 Rails 3 View 中将数据库列名称的翻译显示为表标题

c# - 如何让 C# 显示阿拉伯语?

sql - 使整个 block 有序

css - 一些 unicode 不显示

php - 在 Windows 上列出包含 Unicode 字符的目录

postgresql - Postgres CTE : type character varying(255)[] in non-recursive term but type character varying[] overall