字符串vs文本使用Rails 3.2.*和Postgres - 我应该总是只使用文本

tim*_*one 3 string postgresql ruby-on-rails rails-activerecord

我采用了一个Rails应用程序(Rails 3.2和Postgres 9.4),它有一些Rails字符串,我们已超过255限制.这个应用程序以前使用MySQL而不是Postgres作为后备存储.我的理解是postgres处理字符串和文本相同.它是否正确?在将所有Rails字符串迁移到文本之前,我们应该注意哪些限制?

性能问题是一个值得关注的问题,但不是主要问题.

mu *_*ort 9

精细手册:

提示:这三种类型之间没有性能差异,除了使用空白填充类型时增加的存储空间,以及一些额外的CPU周期来检查存储到长度受限列中的长度.虽然character(n)在其他一些数据库系统中具有性能优势,但PostgreSQL没有这样的优势; 事实上character(n),由于其额外的存储成本,通常是三者中最慢的.在大多数情况下textcharacter varying应该使用.

他们谈论的是三种类型char(n),varchar(n)text.小费基本上是这样说的:

  • char(n) 由于空白填充而不得不检查长度约束是最慢的.
  • varchar(n) 通常在中间,因为需要检查长度约束.
  • text(AKA varchar没有n)通常是最快的,因为没有额外的开销.

除了填补空白的char(n)和长度检查为char(n)varchar(n),他们都处理的幕后相同.

随着ActiveRecord的,t.stringvarchart.texttext.如果您的字符串没有任何硬性限制,那么只需使用t.textPostgreSQL即可.

  • @sekmo AFAIK `t.string` 曾经是 `varchar(255)`,但现在是 `varchar` 而 `t.text` 是并且一直是 `text`。所以是的,在 PostgreSQL 级别,`text` 和 `varchar`(没有 `n`)是相同的(如第 3 点中所述)但 `t.string` 和 `t.text` 并不总是在 ActiveRecord 级别也是如此。 (2认同)