3

我有一个 UTF8 编码和 LC_* en_US.UTF8 的 PostgreSQL 数据库。数据库以许多不同的语言存储文本列。

然而,在某些专栏中,我 100% 确信永远不会有任何特殊字符,即 ISO 国家和货币代码。

我试过做类似的事情:

"countryCode" char(3) CHARACTER SET "C" NOT NULL

 "countryCode" char(3) CHARACTER SET "SQL_ASCII" NOT NULL

但这会带来错误

ERROR: type "pg_catalog.bpchar_C" does not exist
ERROR: type "pg_catalog.bpchar_SQL_ASCII" does not exist

我究竟做错了什么?

更重要的是,我应该为此烦恼吗?我来自 MySQL 背景,这样做是为了提高性能和空间,PostgreSQL 也是这种情况吗?

TIA

4

1 回答 1

2

老实说,我看不到此类设置的目的,例如:

  • 正如@JoachimSauer 所提到的,UTF-8 编码中的 ASCII 子集将占用完全相同的字节数,因为这是发明 UTF-8 的要点:保持 ASCII 不变。因此,我看不到尺寸上的好处;
  • 所有能够处理不同编码字符串的软件都将使用通用的内部编码,现在 PostgreSQL 默认为 UTF-8。当一些文本数据进入处理阶段时,如果编码不匹配,数据库会将其转换为内部编码。因此,如果您将某些列指定为非 UTF8,这将导致数据的额外处理,因此您将失去一些周期(但不要认为它会对性能造成显着影响)。

鉴于没有空间优势并且存在潜在的性能损失,我认为最好保持原样,即将所有列保留在数据库的默认编码中。

我认为对于相同的论点,PostgreSQL 不允许为数据库中的单个对象指定编码。字符集和区域设置在每个数据库级别上设置

于 2012-06-28T12:19:29.893 回答