如果您想使用没有长度限制的字符串,应该在Rails中使用
text
。像这样的迁移:
def up
change_column :your_table, :your_column, :text
end
def down
change_column :your_table, :your_column, :string
end
应该对事情进行排序。您可能希望在末尾使用:null => false
或其他选项。
当您使用没有明确限制的
string
列时,Rails会添加一个隐式的
:limit => 255
。但是如果您使用
text
,则会得到数据库支持的任意长度字符串类型。PostgreSQL允许您在没有长度的情况下使用
varchar
列,但大多数数据库都使用单独的类型,并且Rails不知道没有长度的
varchar
。您必须在Rails中使用
text
才能在PostgreSQL中获得
text
列。在PostgreSQL中,
text
类型和
varchar
类型之间没有区别(但
varchar(n)
是不同的)。此外,如果您在PostgreSQL上部署,根本没有理由使用
:string
(又名
varchar
),除了
varchar(n)
的额外长度约束之外,数据库在内部处理
text
和
varchar(n)
是相同的;仅在列大小存在外部约束(例如政府表格上的第432个字段897/B将为23个字符长)时,才应该使用
varchar(n)
(又名
:string
)。
作为一个附注,如果你在任何地方使用了
string
列,你应该总是指定
:limit
,以提醒自己有一个限制,并且你应该在模型中进行验证以确保不超过限制。如果超过限制,PostgreSQL会抱怨并引发异常,MySQL会悄悄地截断字符串或抱怨(取决于服务器配置),SQLite会让它原样通过,其他数据库将做一些其他的事情(可能是抱怨)。
此外,你还应该在相同的数据库上开发、测试和部署(通常是Heroku上的PostgreSQL),甚至应该使用相同版本的数据库服务器。数据库之间还有其他差异(例如GROUP BY的行为),ActiveRecord无法保护你免受这些差异的影响。你可能已经在这样做了,但我还是想提一下。
更新:新版本的ActiveRecord可以理解没有限制的varchar
,因此至少在PostgreSQL中,您可以使用以下语句:
change_column :your_table, :your_column, :string, limit: nil
将一个
varchar(n)
列更改为
varchar
。 就PostgreSQL而言,
text
和
varchar
仍然是相同的东西,但某些表单构建器会以不同的方式处理它们:
varchar
得到一个
<input type="text">
,而
text
得到一个多行的
<textarea>
。
text
就能获得无限长度;只需要使用未约束的varchar
即可。Rails强加了这个奇怪的限制,而不是PostgreSQL。 - Craig Ringer