在rails中字符串和文本之间的区别?

我正在使用Rails制作一个新的web应用程序,并想知道,stringtext之间的区别是什么?什么时候分别使用?

217845 次浏览

String在数据库中翻译为“Varchar”,而text翻译为“text”。一个varchar可以包含更少的项,一个文本可以是(几乎)任何长度。

要深入分析,请检查http://www.pythian.com/news/7129/text-vs-varchar/

编辑:一些数据库引擎可以一次性加载varchar,但将文本(和blob)存储在表之外。在对name使用text时,SELECT name, amount FROM products可能比在使用varchar时慢得多。由于Rails,默认情况下使用SELECT * FROM...加载记录,您的文本列将被加载。在你或我的应用程序中,这可能永远不会成为一个真正的问题(过早优化是…)。但知道文本并不总是“免费”是件好事。

区别在于如何将符号转换为查询语言中相应的列类型。

用MySQL:字符串映射到VARCHAR

:string |                   VARCHAR                | :limit => 1 to 255 (default = 255)
:text   | TINYTEXT, TEXT, MEDIUMTEXT, or LONGTEXT2 | :limit => 1 to 4294967296 (default = 65536)

参考:

https://hub.packtpub.com/working-rails-activerecord-migrations-models-scaffolding-and-database-completion/

什么时候分别使用?

一般的经验法则是,使用:string进行简短的文本输入(用户名、电子邮件、密码、标题等),使用:text进行较长的预期输入,如描述、评论内容等。

如果你使用postgres,尽可能使用文本,除非你有大小限制,因为文本vs varchar没有性能损失

这三种类型之间没有性能差异,除了在使用空白填充类型时增加了存储空间,以及在存储到长度约束列时增加了一些CPU周期来检查长度。虽然character(n)在其他一些数据库系统中具有性能优势,但在PostgreSQL中没有这种优势;事实上,字符(n)通常是三个中最慢的,因为它需要额外的存储成本。在大多数情况下,应该使用文本或字符变化来代替

PostsgreSQL manual

如上所述,不只是db数据类型,它也会影响将生成的视图,如果你是脚手架。 String将生成text_field text将生成text_area

如果大小固定且较小,则为字符串;如果大小可变且较大,则为文本。 这很重要,因为文本比字符串大得多。它包含更多的千字节。< / p > 所以对于小字段总是使用string(varchar)。字段。First_name,登录名,电子邮件,(文章或帖子的)主题 文本的例子:一篇文章或文章的内容或主体。段落等字段

字符串大小从1到255(默认值为255)

文本大小1到4294967296(默认值为65536

较短的字段使用字符串,如姓名,地址,电话,公司

对于较大的内容、评论、内容、段落使用Text。

我的一般规则是,如果是超过一行的内容,我通常会选择文本,如果是2-6个简短的单词,我就会选择字符串。

对于字符串,官方规则是255。因此,如果字符串超过255个字符,请使用text。

如果你正在使用oracle…STRING将被创建为VARCHAR(255)列,TEXT将被创建为CLOB列。

NATIVE_DATABASE_TYPES = {
primary_key: "NUMBER(38) NOT NULL PRIMARY KEY",
string: { name: "VARCHAR2", limit: 255 },
text: { name: "CLOB" },
ntext: { name: "NCLOB" },
integer: { name: "NUMBER", limit: 38 },
float: { name: "BINARY_FLOAT" },
decimal: { name: "DECIMAL" },
datetime: { name: "TIMESTAMP" },
timestamp: { name: "TIMESTAMP" },
timestamptz: { name: "TIMESTAMP WITH TIME ZONE" },
timestampltz: { name: "TIMESTAMP WITH LOCAL TIME ZONE" },
time: { name: "TIMESTAMP" },
date: { name: "DATE" },
binary: { name: "BLOB" },
boolean: { name: "NUMBER", limit: 1 },
raw: { name: "RAW", limit: 2000 },
bigint: { name: "NUMBER", limit: 19 }
}

https://github.com/rsim/oracle-enhanced/blob/master/lib/active_record/connection_adapters/oracle_enhanced_adapter.rb

如果属性在形式上与f.text_field匹配,则使用字符串;如果属性在形式上与f.text_area匹配,则使用文本

公认的答案是棒极了,它正确地解释了字符串和文本之间的区别(主要是数据库中的限制大小,但还有一些其他的陷阱),但我想指出一个小问题,让我通过它,因为这个答案并没有完全为我做。

最大大小:limit => 1 ~ 4294967296并没有完全像放置的那样工作,我需要从最大大小变为-1。我正在存储大型JSON blobs,有时它们可能非常大。

下面是我的迁移,使用了更大的值,MySQL不会抱怨这个值。

注意限制末尾的5而不是6

class ChangeUserSyncRecordDetailsToText < ActiveRecord::Migration[5.1]
def up
change_column :user_sync_records, :details, :text, :limit => 4294967295
end


def down
change_column :user_sync_records, :details, :string, :limit => 1000
end
end