【问题标题】:Define the length of varchar for MySQL in rails在rails中为MySQL定义varchar的长度
【发布时间】:2012-12-21 06:01:23
【问题描述】:

我想在生成模型的过程中通过git-bash定义rails中varchar的大小,例如name varchar(20)、age varchar(6)。

我在堆栈上搜索但找不到任何答案。

【问题讨论】:

    标签: mysql ruby-on-rails ruby-on-rails-3 varchar


    【解决方案1】:

    在创建列时,有许多选项记录在 column 方法中。在进行后续修改时,它们也适用于add_column

    制作更有限的列最简洁的方法是:

    t.string :name, :limit => 20
    t.string :age, :limit => 6
    

    请注意,在您的数据库中施加这样的限制是非常不寻常的,更好的解决方案是使用validates 限制模型。例如:

    validates :name,
      :presence => true,
      :length => { :maximum => 20 }
    

    MySQL 倾向于在不告诉你的情况下截断太长的值,因此没有长度限制最终会导致数据丢失,尤其是长度如此短的情况下。

    请记住,数据库中的VARCHAR 列是可变长度的,因此VARCHAR(255) 中的十个字符值与VARCHAR(20) 相比没有存储优势。

    【讨论】:

    • 请教一个问题.. 为什么我们在生成模型时不通过命令行以 'name :varchar(20)' 的方式定义它,我只是想知道? .. 请不要介意一个模糊的问题。
    • 支持通过命令行定义模型,但您可以实现的功能受到更多限制。这也是一个相当奇特的功能,我不确定为什么有必要这样做。使用它而不是从脚本中渲染出您自己的完全自定义的迁移文件有什么好处?例如,通常模型至少需要进行一些编辑才能添加索引,除了最琐碎的情况之外的所有情况除外。
    • 我认为在数据库模型中这样做会更好。您可能不会节省存储空间,但在数据库中的每个字符串上都使用 varchar 255 会增加对象的内存占用。
    • @fatfrog 字符串只占用与填充的字符一样多的内存。 VARCHAR(255) 对 Ruby 的影响为零。通过扩展,您是否希望 LONGTEXT 自动占用 2GB 内存?
    • @fatfrog 除非您正在处理具有大量索引数据的大型表(>1MM 记录),否则这不会成为问题。我认为你在这里无中生有。
    猜你喜欢
    • 2011-12-17
    • 1970-01-01
    • 1970-01-01
    • 2013-02-15
    • 2011-01-01
    • 1970-01-01
    • 2010-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多