【问题标题】:Why should I ever choose any other length than 255 for varchar in MySQL?为什么我应该为 MySQL 中的 varchar 选择 255 以外的任何其他长度?
【发布时间】:2011-03-10 20:25:11
【问题描述】:

我知道 CHAR 和 VARCHAR 的区别,

CHAR - 固定长度

VARCHAR - 可变长度(大小 + 1 个字节)

但我想知道选择 varchar 长度的目的是什么,例如VARCHAR(50)VARCHAR(100)VARCHAR(255)

这对我来说似乎毫无意义,因为实际使用的空间取决于存储在数据库中的值。

所以我的问题是:

1) 可以将我所有的 varchar 设置为 255 2) 为什么要指定其他长度?

【问题讨论】:

标签: mysql char varchar


【解决方案1】:

摘自MySQL documentation

CHAR 和 VARCHAR 类型相似,但它们的存储和检索方式不同。从 MySQL 5.0.3 开始,它们的最大长度以及是否保留尾随空格也有所不同。

CHAR 和 VARCHAR 类型的声明长度表示要存储的最大字符数。例如,CHAR(30) 最多可容纳 30 个字符。

CHAR 列的长度固定为您在创建表时声明的长度。长度可以是 0 到 255 之间的任何值。当存储 CHAR 值时,它们用空格右填充到指定长度。检索 CHAR 值时,将删除尾随空格。

VARCHAR 列中的值是可变长度字符串。在 MySQL 5.0.3 之前,长度可以指定为 0 到 255 之间的值,在 5.0.3 及更高版本中可以指定为 0 到 65,535 之间的值。 MySQL 5.0.3 及更高版本中 VARCHAR 的有效最大长度取决于最大行大小(65,535 字节,所有列共享)和使用的字符集。

与 CHAR 相比,VARCHAR 值存储为一个字节或两个字节长度的前缀加上数据。长度前缀表示值中的字节数。如果值需要不超过 255 个字节,则一列使用一个长度字节,如果值可能需要超过 255 个字节,则使用两个长度字节。

【讨论】:

  • 请注意引用时链接到来源。
  • 一个小修正:链接的文档说VARCHAR MySQL >= 5.0.3 的上限为 65,535。引用:“The length can be specified as a value from 0 to 255 before MySQL 5.0.3, and 0 to 65,535 in 5.0.3 and later versions.
【解决方案2】:

1) 如果您不想限制存储的 varchar 的最大大小,那么可以。话说……

2) 在许多情况下,您希望设置 varchar 大小的上限。假设您正在存储一个邮件列表,并且地址行的空间有限。通过为您的地址字段设置上限,您现在允许数据库为您强制执行最大地址行长度。

【讨论】:

    【解决方案3】:

    1) 从技术上讲,这很好,因为在开始时创建的字段长度只有 1 或 2 个字节。之后,它们会根据需要生长。

    2) 话虽如此,但良好的设计原则建议您适当设置字段长度,以便 a) 如果有人通过表格方案并试图计算出特定字段中存储了多少数据,他们可以看到某些字段将比其他人保存更少的数据,并且 b) 您可以防止数据库引擎完成少量额外工作,因为它必须在插入期间从 VARCHAR(10) 字段中截断比 VARCHAR(255) 更少的空间。

    您可以在此处查看有关它的更多详细信息:

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

    【讨论】:

      【解决方案4】:

      我在其他地方读到,当您对使用它们定义的列运行选择时,varchar 相对于 char 会带来性能损失。所以,也许你想选择 char,如果你确定该字段总是有一定的长度,并且你有性能问题......

      【讨论】:

      • 我想查看此声明的参考资料。
      • 很公平,我会给你一个,只是这个评论是三年多以前的,我什至不记得我在哪里看到的。
      【解决方案5】:

      1) 是的。

      2) 从历史上看,这是一个性能打击。

      查看诸如 sqlite 之类的数据库,这些数据库将所有内容都存储为文本,以证明它不再重要。

      【讨论】:

      • sqlite 并不是完全高性能的数据库 - 如果它强制行大小可变,则 varchar 会影响性能。
      • 是的,但是对于大多数人和大多数人来说,它的速度足够快
      • 没错,但声称它“不再”重要并将 sqlite 用作数据库工程的顶峰确实具有误导性。不,对于大多数人和大多数用途来说,它还不够快 - 它只是最容易配置并且超过成本,至少在最初......只要你从来没有来自多个用户的同时请求,就是这样。
      【解决方案6】:

      CHAR 与 VARCHAR

      CHAR 用于固定长度大小变量。
      VARCHAR 用于可变长度大小变量。

      例如

      create table emp
      (f_name CHAR(20),
       l_name VARCHAR(20)
      );
      
      insert into emp values('Suraj','Chandak');
      
      select length(f_name), length(l_name) from emp;
      
      Output will be
      
      length(f_name)          Length(l_name)
         20                       7
      

      CHAR vs VARCHAR的最佳答案

      编辑

      • 您可以设置列的最大上限。
      • 性能和存储会产生影响。

      谢谢。

      【讨论】:

      • 问题是“1)可以将我所有的 varchar 设置为 255 2)为什么要指定任何其他长度?”,而不是 CHAR 与 VARCHAR。
      【解决方案7】:

      在对字符串进行比较时,这两种值类型之间的主要区别就体现出来了。

      在预定义长度的 CHAR 列中,您必须在整个列长度中一直“运行”,而在 VARCHAR 列中,您需要在整个值长度而不是列中一直“运行”长度,在大多数情况下更快。

      因此,如果存储在 VARCHAR 字段中,则比较小于字段长度的值长度会更快。

      【讨论】:

        【解决方案8】:

        但我想知道选择 varchar 长度的目的是什么,例如VARCHAR(50)、VARCHAR(100)、VARCHAR(255)

        这对我来说似乎毫无意义,因为实际使用的空间取决于存储在数据库中的值。

        指定例如VARCHAR(5) 而不是 VARCHAR(500) 在某些情况下可以为您提供更好的性能,例如用于使用内存临时表的操作。

        另一种情况是限制列长度以符合域要求(当您的值不应大于某个最大值时。例如:DNS 中的完整域名不得超过 253 个字符的长度)

        【讨论】:

          【解决方案9】:

          固定长度(静态)表更快。当表中的每一列都是“固定长度”时,该表也被认为是“静态”“固定长度”。非固定长度的列类型示例有:VARCHAR、TEXT、BLOB。

          http://net.tutsplus.com/tutorials/other/top-20-mysql-best-practices/

          因此,如果您的表没有任何其他字段,即 varchar、text 或 blob;您可以使用 char 并使您的表格成为静态表格。这样他们会更快。

          【讨论】:

          • 那个答案与这里提出的问题无关。
          • 你是对的。我不记得为什么我发布了这个答案。也许那时,我正在寻找相关的东西。也许他编辑了他的问题?
          • 不知道,可能是。我不知道如何查看他的编辑历史,也不知道我是否有足够的声誉一开始就看到它。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-05-31
          • 2010-11-18
          • 2014-06-09
          • 1970-01-01
          • 2021-02-22
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多