需要解释PostgreSQL中的字符类型吗

需要解释PostgreSQL中的字符类型吗,postgresql,Postgresql,我浏览了有关PostgreSQL字符类型的文档。但我仍然有一些问题 “char”是固定长度的i,e1 如果是的话,“char[]”的长度是多少?因为我无法在pgadmin中更改它,所以我认为它用于可变长度字符数组。那么,实际的默认大小是多少 与“char”[]相比,字符的用途是什么?现在我假设字符用于我们定义大小的固定长度字符数组 为什么使用字符[] 字符变化和字符变化[]之间有什么区别?如果您来自C语言背景,PostgreSQL中的字符串类型不是字符数组 对于PostgreSQL中的每种类型f

我浏览了有关PostgreSQL字符类型的文档。但我仍然有一些问题

“char”是固定长度的i,e1 如果是的话,“char[]”的长度是多少?因为我无法在pgadmin中更改它,所以我认为它用于可变长度字符数组。那么,实际的默认大小是多少

与“char”[]相比,字符的用途是什么?现在我假设字符用于我们定义大小的固定长度字符数组

为什么使用字符[]


字符变化和字符变化[]之间有什么区别?

如果您来自C语言背景,PostgreSQL中的字符串类型不是字符数组

对于PostgreSQL中的每种类型
foo
,都有一个对应的数组类型
foo[]
,表示
foo
类型的值数组。仅当您不打算在数据库中过多地操作数组类型时才使用数组类型;如果这样做,通常最好将数组规范化为一个单独的表

撇开数组类型不谈,还有不同的字符类型:

  • “char”
    (需要双引号):单个字符。主要用于目录表中。除非你知道自己在做什么,否则不要使用这种类型

  • 字符(n)
    字符(n)
    :固定长度字符串。无论你在那里储存什么,它的右边都会有空格。SQL标准规定的行为有时令人惊讶,因此您很少需要这种类型

  • text
    :任意长度的字符串。这是您想要的字符串类型,除非您希望数据库施加长度限制

  • 字符变化(n)
    varchar(n)
    :这与
    文本相同,但有额外的长度限制

用一个例子来结束它:

CREATE TABLE strtest(
   id serial PRIMARY KEY,
   sc "char",
   c character(10),
   vc character varying(10),
   vca character varying(10)[]
);

INSERT INTO strtest (sc, c, vc, vca)
   VALUES (
      'x',
      'short',
      'short',
      ARRAY['short1', 'short2', 'short3']
   );

SELECT sc, c, vc, vca[2] FROM strtest;
 sc |     c      |  vc   |  vca
----+------------+-------+--------
 x  | short      | short | short2
(1 row)

[]
表示一个数组,而不是一个值:很好的演示,我来自传统的RDBMS方面。运行上面提供的查询时,似乎这个array[]特性可以像非规范化格式一样将列的所有表格单元格封装为一个。读到它的底部说,
数组不是集合;搜索特定数组元素可能是数据库设计错误的标志。考虑为每个项目使用一个单独的表,这将是一个数组元素。这将更易于搜索,并且对于大量元素可能会更好地扩展。
array有什么好处吗?如果您有数据库方面的背景,您将了解规范化。如果存储在数组中的数据相对于数据库是原子的,则使用数组,也就是说,您不打算使用单个元素进行数据库处理。虽然在
WHERE
条件下使用数组元素效果很好,但如果您希望在数组元素上使用外键或希望它们处于联接条件下,那么您就做错了。如果您非常了解这一点,请通过一个实际示例来说明这一好处。例如,
Salary
列是
int[]
。我们将继续附加到此数组。要查找特定时间的薪资,我们必须查询与时段
x
对应的数组
Salary[x]
。这在传统的RDBMS中是简单而直接的。阵列在这种情况下有何帮助?非常感谢您在advanced中的介绍。我不知道数组对这个示例有什么帮助。我会用不同的方式来建模。但这一切都取决于你的查询:如果它们简单高效,你就很好。