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

时间:2010-07-28 15:15:33

标签: ruby-on-rails

我正在使用Rails创建一个新的Web应用程序,并且想知道stringtext之间有什么区别?什么时候应该使用?

9 个答案:

答案 0 :(得分:500)

差异在于如何在查询语言中将符号转换为各自的列类型。

  使用MySQL

:字符串映射到VARCHAR(255)    - http://guides.rubyonrails.org/migrations.html

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

参考:

  

http://www.packtpub.com/article/Working-with-Rails-ActiveRecord-Migrations-Models-Scaffolding-and-Database-Completion

什么时候应该使用?

作为一般经验法则,使用:string进行短文本输入(用户名,电子邮件,密码,标题等),并使用:text获取更长的预期输入,例如说明,评论内容,等

答案 1 :(得分:148)

如果你正在使用postgres使用文本,除非你有一个大小限制,因为text vs varchar没有性能损失

  

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

PostsgreSQL manual

答案 2 :(得分:17)

字符串转换为数据库中的“Varchar”,而文本转换为“text”。 varchar可以包含更少的项目,文本可以(几乎)任何长度。

如需深入分析,请参阅http://www.pythian.com/news/7129/text-vs-varchar/

编辑:有些数据库引擎可以一次加载varchar,但会将文本(和blob)存储在表格之外。使用SELECT name, amount FROM products text时使用name比使用varchar要慢得多SELECT * FROM...。而且由于Rails默认加载{{1}}的记录,因此将加载您的文本列。这可能永远不会成为您或我的应用程序中的真正问题(过早优化是......)。但要知道文本并非总是“免费”,这很有用。

答案 3 :(得分:11)

如上所述,不仅仅是db数据类型,如果你是脚手架,它也会影响将生成的视图。 string会生成一个text_field文本,会生成一个text_area

答案 4 :(得分:11)

字符串(如果大小固定且小)和文本(如果它是可变的和大的)。 这很重要,因为文本比字符串大。它包含更多的千字节。

因此对于小字段总是使用字符串(varchar)。字段如。 first_name,登录,电子邮件,主题(文章或帖子) 和文本的例子:帖子或文章的内容/正文。段落等字段

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

文字大小1至4294967296(默认= 65536)2

答案 5 :(得分:2)

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

将文字用于更大的内容,评论,内容,段落。

我的一般规则,如果它是多于一行的东西,我通常会选择文本,如果它是一个短的2-6个单词,我会选择字符串。

字符串的官方规则是255。因此,如果您的字符串超过255个字符,请转到文本。

答案 6 :(得分:0)

如果您使用的是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

答案 7 :(得分:0)

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

答案 8 :(得分:0)

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

最大大小:limit => 1到4294967296 不能完全按原样工作,我需要从最大大小开始为-1。我存储的是大型JSON Blob,有时它们可​​能会变得非常大。

这是我的迁移,具有更大的价值,而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