我正在使用Rails制作一个新的网络应用,我想知道string
和text
之间有什么区别?什么时候应该分别使用?
区别在于符号如何在查询语言中转换为各自的列类型。
在MySQL中:string被映射为VARCHAR(255)。
:string | VARCHAR | :limit => 1 to 255 (default = 255)
:text | TINYTEXT, TEXT, MEDIUMTEXT, or LONGTEXT2 | :limit => 1 to 4294967296 (default = 65536)
参考。
应该在什么时候分别使用?
作为一般的经验法则,短的文本输入(用户名、电子邮件、密码、标题等)使用:string
,长的预期输入如描述、评论内容等使用:text
。
如果你使用postgres,除非你有大小限制,否则尽量使用文本,因为文本与varchar相比,没有性能上的损失。
这三种类型之间没有性能差异,除了在使用空白填充类型时增加了存储空间,以及在存储到长度受限的列中时需要额外的CPU周期来检查长度。虽然character(n)在其他一些数据库系统中具有性能优势,但在PostgreSQL中没有这种优势;事实上character(n)通常是三种类型中最慢的,因为它有额外的存储成本。在大多数情况下,应该使用文本或字符的变化来代替
在你的数据库中,字符串被翻译成"Varchar",而文本被翻译成"text"。Varchar可以包含更少的项目,而text可以有(几乎)任何长度。
关于深入的分析和良好的参考资料,请查看http://www.pythian.com/news/7129/text-vs-varchar/
编辑:一些数据库引擎可以一次性加载varchar
,但将文本(和blob)存储在表外。一个SELECT name, amount FROM products
,当使用text
来表示name
时,可能会比使用varchar
时慢得多。由于Rails默认使用SELECT * FROM...
加载记录,你的文本列将被加载。虽然这在你我的应用中可能永远不会成为一个真正的问题(过早的优化是......)。但是,知道文本并不总是"免费"是很好的事情。
如果大小是固定的、小的,就用字符串;如果大小是可变的、大的,就用文本。 这一点很重要,因为文本比字符串大得多。 它包含了更多的千字节。
所以对于小字段总是使用string(varchar)。 像这样的字段:first_name, login, email, etc. first_name, login, email, subject (文章或帖子的主题) 和文字的例子。 帖子或文章的内容/正文。 段落等字段
字符串大小为1至255(默认为255)。
文字大小1至4294967296(默认值=65536)2。
被接受的答案很不错,它正确地解释了字符串与文本之间的区别(主要是数据库中的限制大小,但还有其他一些小问题),但我想指出一个小问题,让我度过了难关,因为那个答案并没有完全为我做到。
最大大小:限制=> 1到4294967296并没有完全按照放的那样工作,我需要从那个最大尺寸去-1。 我'正在存储大的JSON blobs,它们有时可能会疯狂的巨大。
下面是我的迁移,用较大的值代替MySQL不抱怨的值。
请注意,限制的最后是5,而不是6。
类 ChangeUserSyncRecordDetailsToText <
ActiveRecord::Migration[5.1]。
def up
change_column :user_sync_records, :details, :text, :limit =>
4294967295
结束
挫折
change_column :user_sync_records, :details, :string, :limit =>
1000
结束
结束
如果你使用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 }
}
如果属性与表单中的f.text_field
匹配,则使用string,如果与f.text_area
匹配,则使用text。