【问题标题】:Difference between VARCHAR(x) and VARCHAR(y) in SQLSQL中VARCHAR(x)和VARCHAR(y)的区别
【发布时间】:2012-12-06 20:31:31
【问题描述】:

我了解到 VARCHAR 占用唯一需要的内存,而 CHAR 则无论是否需要总是占用相同数量的内存。

我的问题:假设我有一个字段 VARCHAR(50),我知道如果它需要存储 30 个字符,它只会占用 30 个字节并且不会超过(假设 1 个字符需要一个字节)。那么我为什么还要提到 50 或 30 或任何上限,因为它只会占用所需的内存。

更新:既然不会占用无用的内存,为什么还要提上限呢?

【问题讨论】:

  • 其中一个好处是,每当有人尝试在此列中输入 n (n>50) 字节时,数据库都会引发错误。所以数据库设计者可以确定这条记录不会浪费超过 50 个字节
  • 这个问题的重复:stackoverflow.com/questions/262238/…
  • @DiegoBasch 也许我应该修改问题标签

标签: mysql sql database database-design varchar


【解决方案1】:

更新:既然不会占用无用的内存,为什么还要提上限?

如果您使用 final_value = left(provided_value, 30) 之类的东西来清理您的输入,那么这对您的数据库来说不是问题。如果您愿意,可以将其设置为varchar(255)

设置最大限制的想法是确保您不会错误地发送比实际计划更多的字符。

  1. 将来代码维护调用每个表的每一列的数据大小限制会很痛苦。无论如何,您都需要这样做,但将您的表定义视为有关该信息的单一来源。

  2. 是否只能通过您的应用或网站中的一段代码将表写入 (insert/update)?如果数据库有另一个接口,例如 REST API 侦听器,如果您不再输入相同的值,您将遇到数据不统一的问题——这正是 db 能够防止的问题。

  3. 如果编码错误(或黑客攻击)绕过了您的应用/网站对数据的控制(大小限制或更糟),那么至少您的数据库仍将正确维护数据。

【讨论】:

    【解决方案2】:

    你不会的。你会做到VARCHAR(30)。这大约是允许的最大字符数。那么,为什么还要让一个包含 30 个字符的列接受最多 50 个字符呢?

    【讨论】:

    • 我的问题是为什么我必须提到上限,因为不会占用无用的内存。
    • 好吧,因为您只想允许那么多字符。这不是内存的决定,而是您的应用程序设计。如果您只想允许 X 字符,则需要指定某个位置,不是吗?
    • @djaqeel,你怎么知道不会有无用的内存被占用?如果您不提及上限,那么在同一数据库上工作的其他开发人员可能会认为在此列中存储数千个字符会很酷。
    【解决方案3】:

    为了使事情变得动态,您使用 VARCHAR(50),因为将来可能会超过字符串大小,并且您知道最大大小可以是 50,但是对于常量,您可以使用 CHAR(30),这意味着字符串的大小将始终为 30 ,如果大小超过或减小,我的 sql 将报告异常

    看看 http://dev.mysql.com/doc/refman/5.0/en/char.html

    【讨论】:

      【解决方案4】:

      当内存使用是您唯一关心的问题时,您可以为 varchar 提供任意大的数字。但是,如果您想确保保持一个上限,那么您可以将其作为 varchar 的最大值。

      【讨论】:

        【解决方案5】:

        您可以使用 VARCHAR(50) 或 VARCHAR(30)。这不是问题,但如果它是动态的,我们无法判断极限。

        在这种情况下,我们采取最大限制。

        【讨论】:

          猜你喜欢
          • 2011-04-25
          • 2021-03-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-07-18
          • 2014-08-30
          相关资源
          最近更新 更多