【发布时间】:2020-02-27 20:07:23
【问题描述】:
我有一个需要存储 UN/LOCODE 值的数据库,我发现,使用标准数据类型,不可能以固定大小的形式存储这些值,这样我就可以有效地播放俄罗斯方块。
目前,我已经为它定义了一个域如下:
-- city: UN/LOCODE https://service.unece.org/trade/locode/Service/LocodeColumn.htm#LOCODE
CREATE DOMAIN t_locode AS VARCHAR
CONSTRAINT t_locode_check CHECK (
value IS NULL
OR
value ~ '^[A-Z]{2} [A-Z][A-Z0-9]{1,2}$'
);
...导致:
testing=# \dT+ t_locode
List of data types
-[ RECORD 1 ]-----+---------
Schema | public
Name | t_locode
Internal name | t_locode
Size | var
Elements |
Owner | postgres
Access privileges |
Description |
我还尝试使用固定长度的字符类型定义而不是VARCHAR(例如CHAR(6)),但这根本没有改变,我怀疑这是因为数据库本身设置为UTF- 8,顾名思义就是变长字符编码。
为了进一步解决该问题,该域随后用于其他用户数据类型。
充其量,我想定义一种数据类型,它可以使用最多 8 个字节的存储空间来存储这些值,以与双精度对齐。
有人知道解决办法吗?
【问题讨论】:
-
您的域名到底有什么问题? “列俄罗斯方块”是什么意思?
-
我的问题是它在存储上不是固定大小的,而是可变的,因此最终在扩展存储中。但是,由于我有某些表使用带有“NOT NULL”的域,出于性能和表大小的原因,我希望将它们包含在普通存储中(一些表将在 10-30 列有数十亿行) .
-
“列俄罗斯方块”我指的是以下内容:2ndquadrant.com/en/blog/on-rocks-and-sand
-
"在扩展存储中结束" - 如果它们短于 ~2k,则不会
-
@a_horse_with_no_name 你有什么参考资料可以让我了解更多吗?
标签: postgresql