在UTF-8 PostgreSQL数据库中指定ASCII列

时间:2012-06-28 11:51:02

标签: postgresql ascii postgresql-9.1

我有一个带有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

1 个答案:

答案 0 :(得分:2)

老实说,我没有看到这样设置的目的,如:

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

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

我认为对于相同的参数,PostgreSQL不允许为数据库中的单个对象指定编码。 Character Set and Locale are set on the per-database level