固定大小字符串的 Postgres 数据类型

Posted

技术标签:

【中文标题】固定大小字符串的 Postgres 数据类型【英文标题】:Postgres data type for a fixed size string 【发布时间】:2018-05-25 00:23:18 【问题描述】:

对于保存固定大小字符串值的主键,最好的 Postgres 数据类型是什么?

(例如 - 值正好是字母表中的 6 个字符 [0-z,a-z,A-Z])。

我应该使用 char[6] 吗(它甚至适合用作主键吗?) 我应该在应用程序中使用 bigserial 并从数字转换为 base62 吗?

【问题讨论】:

我的第一个想法是使用带有check 约束的字符串。 我认为text 是任何char 的“最佳”,无论是可变长度还是固定长度 我要放一个PK约束。我在问更多关于性能的问题。如果我检查约束 - 我会检查每个错误的插入。 你可能应该通读 postgresql.org/docs/current/static/datatype-character.html 一方面,我很确定 Postgres 中的 VarChar(6)text 几乎相同,但对长度有一个检查约束,而 @987654327 @ 实际上必须在某些情况下做额外的工作来处理空间填充。 【参考方案1】:

你可以这样做:

create table t (
    tId char(6) primary key,
    . . .
    constraint chk_t_tId check (tId ~ '^[0-9a-zA-Z]6$')
);

将 id 设置为六个字符串没有问题。

【讨论】:

我会对固定长度的优点感兴趣; according to the manual,没有:“虽然 character(n) 在其他一些数据库系统中具有性能优势,但在 PostgreSQL 中没有这样的优势”。但也许有一些关于索引/约束的边缘案例原因? @IMSoP 。 . .我理解那张纸条。我不认为 Postgres 存储固定长度字符串的长度——这是我考虑的轻微的效率提升。 那么肯定是注释错了,还有性能优势? FAQ on the Postgres wiki 同意手册,它没有区别;它是句子所指的四种类型之一:“上面的前四种类型是“varlena”类型(即,字段长度显式存储在磁盘上,然后是数据)。” 一些随机搜索在this old mailing list thread 中发现了一个可能的原因:在传递值时,您需要知道它们的长度以安全地处理它们,因此始终将长度附加到任何字符串或类似的数据,即使它是在可以从架构或其他类型信息中推断出来的上下文中使用的。 请注意,Unicode 排序规则可能是基于字符串的索引查找的真正性能杀手。使用COLLATE "C" 声明主键可能是个好主意。

以上是关于固定大小字符串的 Postgres 数据类型的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 postgres DB 确定数据库类型 NONE 的嵌入式数据库驱动程序类

Postgres 数据类型转换

数据类型

java集合和数组的区别,举例子

使用带有自定义分隔符的 postgres 按字符大小复制文本文件

32位和64位操作系统基本数据类型字节大小