【问题标题】:What's the difference between VARCHAR and CHAR?VARCHAR 和 CHAR 有什么区别?
【发布时间】:2010-12-25 12:45:21
【问题描述】:

MySQL 中的 VARCHAR 和 CHAR 有什么区别?

我正在尝试存储 MD5 哈希。

【问题讨论】:

  • MD5 哈希总是 32 个字符。因此,为了最大限度地提高性能,请使用 CHAR(32),因为 CHAR 是固定长度的(有关 CHAR 和 VARCHAR 之间差异的更多详细信息,请参阅下面的答案)。

标签: sql mysql


【解决方案1】:

VARCHAR 是可变长度的。

CHAR 是固定长度的。

如果您的内容是固定大小的,则使用CHAR 可以获得更好的性能。

有关详细说明,请参阅CHAR and VARCHAR Types 上的 MySQL 页面(请务必阅读 cmets)。

【讨论】:

  • @steven:当匿名。说“您的内容是固定大小”,这意味着您的表格行必须包含所有固定大小的字段。如果您在一个字段中针对 VARCHAR 使用 CHAR,则不会获得性能提升,但该表包含其他 VARCHAR 字段。
  • no char 数据类型增加了性能...同时执行查询 sql 将生成执行计划。假设有 2 列 charcol char(2000) 和 VarcharCol Varchar(2000)。在执行计划中,估计的 varchar 类型列的行大小可能会被低估。因此它导致溢出到临时数据库。所以使用 char 对性能有好处
  • VARCHAR(n) 括号中的值是什么意思?
  • @Marco Demaio 你知道这背后的原因吗?
  • @jdc91:为了提高性能,整行必须是固定宽度的。 MySQL 在计算这种表中行的空间需求和偏移量时获得优势。
【解决方案2】:

字符

  1. 用于存储固定长度的字符串值。
  2. 最大数量数据类型可以容纳的字符数为 255 个字符
  3. 它比 VARCHAR快 50%
  4. 使用静态内存分配

VARCHAR

  1. 用于存储可变长度字母数字数据。
  2. 此数据类型可以容纳的最大值为
    • MySQL 5.0.3 之前的版本:255 个字符
    • MySQL 5.0.3 后:65,535 个字符为行共享。
  3. 比 CHAR 慢
  4. 使用动态内存分配

【讨论】:

  • 我对这个答案如此频繁地投票感到有点惊讶。 MySQL 文档指出 Values in VARCHAR columns are variable-length strings. 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.
  • 更不用说你也可以在char中存储字母数字数据
  • 这 50% 的速度基于什么?快 50% 做什么?在什么条件下?在这种情况下,静态内存分配与动态分配是什么意思?
  • @MartinSmith 我也想问同样的问题.. 不要认为这些信息是准确的。 asktom.oracle.com/pls/asktom/…
  • -1;这里的性能声明含糊不清且未经证实,内存分配策略的差异(以及为什么重要)没有得到充实,并且 varchar 存储“字母数字数据”的说法有点奇怪; varchar 列当然也可以存储非字母数字字符!
【解决方案3】:

CHAR 与 VARCHAR

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

例如

Create table temp
(City CHAR(10),
Street VARCHAR(10));

Insert into temp
values('Pune','Oxford');

select length(city), length(street) from temp;

输出将是

length(City)          Length(street)
10                    6

结论:要有效使用存储空间,必须使用 VARCHAR 而不是 CHAR,如果可变长度是可变的

【讨论】:

  • 城市 = char(10),街道 = varchar(10),城市 = 浦那,街道 = 牛津,长度(城市)= 4,长度(街道)= 6
  • 这个查询 (select length(city), length(street) from temp) 在 mysql 5.7 mysql> 中给出以下输出 mysql> select length(city), length(street) from temp; +--------------+----------------+ |长度(城市) |长度(街道) | +--------------+----------------+ | 4 | 6 | +--------------+----------------+ 1 行在集合中(0.00 秒)
【解决方案4】:

CHAR(x) 列只能有完全 x 字符。
VARCHAR(x) 列可以有最多x 字符。

由于您的 MD5 哈希值总是相同的大小,您可能应该使用 CHAR

但是,您一开始就不应该使用 MD5;它有已知的弱点。
请改用 SHA2。
如果你要散列密码,你应该使用 bcrypt。

【讨论】:

  • “一个 CHAR(x) 列只能有 x 个字符。”。实际上,您可以添加少于 x 个字符的数据,但我认为您的意思是它总是在幕后保留 10 个字符的内存。
  • 您不知道他们为什么要存储 md5 哈希值,使用 md5 有很多很多与安全性无关的正当理由。碰撞根本不常见,算法比更安全的算法更快。
  • 假设 CHAR(x) 列不完全强制 x 字符是否有任何理由在 VARCHAR(x) 上使用它,即使对于固定大小的数据?
【解决方案5】:

MySQL 中的 VARCHAR 和 CHAR 有什么区别?

对于已经给出的答案,我想补充一点,在 OLTP 系统或频繁更新的系统中,即使对于可变大小的列,也可以考虑使用 CHAR,因为更新期间可能出现 VARCHAR 列碎片。

我正在尝试存储 MD5 哈希值。

如果安全性真的很重要,MD5 哈希不是最佳选择。但是,如果您将使用任何散列函数,请考虑使用 BINARY 类型代替它(例如,MD5 将产生 16 字节散列,因此 BINARY(16) 就足够了,而不是 CHAR(32) 用于表示十六进制数字的 32 个字符。这样可以节省更多空间并提高性能。

【讨论】:

  • 按照这个思路,我将使用 CHAR 表示业务 ID,这意味着可读性与效率。不过我还是会使用 bigint 主键。
【解决方案6】:

如果输入的字符比声明的长度短,Varchar 会切断尾随空格,而 char 不会。 Char 将填充空格,并且始终是声明长度的长度。在效率方面,varchar 更擅长,因为它修剪字符以允许更多调整。但是,如果您知道 char 的确切长度,char 的执行速度会更快。

【讨论】:

    【解决方案7】:

    CHAR 是固定长度,VARCHAR 是可变长度。 CHAR 始终使用每个条目的相同数量的存储空间,而 VARCHAR 仅使用存储实际文本所需的数量。

    【讨论】:

      【解决方案8】:

      CHAR 是一个固定长度的字段; VARCHAR 是一个可变长度字段。如果要存储长度可变的字符串(例如名称),则使用 VARCHAR,如果长度始终相同,则使用 CHAR,因为它的大小效率略高,速度也略快。

      【讨论】:

      • 虽然我猜测这里关于速度和存储效率的说法是正确的,但它们都没有以任何方式得到证实(它们完全有可能是错误的),这使得这个答案没有用;它只是重复了读者可能已经预料到的事实,而没有做任何事情来真正帮助确认它。
      【解决方案9】:

      在当今的大多数 RDBMS 中,它们是同义词。但是对于那些仍然有区别的系统,CHAR 字段存储为固定宽度的列。如果将其定义为 CHAR(10),则将 10 个字符写入表中,其中“填充”(通常是空格)用于填充数据未用完的任何空间。例如,保存“bob”将保存为(“bob”+7 个空格)。 VARCHAR(可变字符)列旨在存储数据,而不会像 CHAR 列那样浪费额外空间。

      一如既往,Wikipedia 说话声音更大。

      【讨论】:

      • 我不同意“它们是同义词”。一方面,MySQL 似乎直接与这一说法相矛盾。 “CHAR 和 VARCHAR 类型相似,但存储和检索方式不同...” (Source)
      • “在大多数”...而“今天”是 12 年前 :)
      • 你是对的!可能对其他人更新答案很有价值。
      【解决方案10】:

      CHAR

      • CHAR 是固定长度的字符串数据类型,因此字段中的任何剩余空间都用空格填充。
      • CHAR 每个字符占用 1 个字节。因此,一个 CHAR(100) 字段(或变量)在磁盘上占用 100 个字节,无论它包含什么字符串。

      VARCHAR

      • VARCHAR 是一种可变长度的字符串数据类型,因此它只包含您分配给它的字符。
      • VARCHAR 每个字符占用 1 个字节,+ 2 个字节来保存长度信息(例如,如果您设置 VARCHAR(100) 数据类型 = 'Dhanika',那么它将占用 7 个字节(对于 D、H、 A、N、I、K 和 A)加上 2 个字节,或总共 9 个字节。)

      【讨论】:

      • 我认为是1个字节来保存长度信息,而不是2个
      【解决方案11】:

      CHAR

      1. 使用特定的内存分配
      2. 省时

      VARCHAR

      1. 使用动态内存分配
      2. 内存高效

      【讨论】:

        【解决方案12】:

        char是定长字符数据类型,varchar是变长字符数据类型。

        因为 char 是定长数据类型,所以 char 值的存储大小等于该列的最大大小。因为 varchar 是变长数据类型,所以 varchar 值的存储大小是输入数据的实际长度,而不是该列的最大大小。

        当列中的数据条目预期大小相同时,您可以使用 char。 当列中的数据条目的大小预计会有很大差异时,您可以使用 varchar。

        【讨论】:

          【解决方案13】:

          High Performance MySQL书:

          VARCHAR 存储可变长度的字符串,是最常见的字符串数据类型。它可能需要更少的存储空间 固定长度类型,因为它只使用所需的空间 (即,更少的空间用于存储较短的值)。一个例外是 使用 ROW_FORMAT=FIXED 创建的 MyISAM 表,它使用固定数量 每行的磁盘空间,因此会浪费空间。 VARCHAR 有帮助 性能,因为它节省空间。

          CHAR 是固定长度的:MySQL 总是为指定数量的字符分配足够的空间。存储 CHAR 值时,MySQL 删除任何尾随空格。 (MySQL 中的 VARCHAR 也是如此 4.1 和更早的版本——CHAR 和 VAR CHAR 在逻辑上相同,只是存储格式不同。)值用空格填充 比较需要。

          【讨论】:

          • "VARCHAR 有助于提高性能,因为它节省了空间" 是的,它节省了空间,但它不会对性能产生负面影响吗? VARCHAR 需要在需要时动态分配内存,从而降低性能,而不是 CHAR,对吧?
          • @Spikatrix 取决于。如果 VARCHAR 值通常很小但最多可达 N 字节,那么动态分配可以节省大量空间和 I/O,这对于大量数据而言性能更高。长度大致相等的 CHAR 值会更高效。读取与写入也可能有所不同。
          • 固定长度数据类型的要点是偏移量是可预测的,即如果你将一个 CHAR(M) 数组保存到磁盘,你就知道项 N 在字节偏移量 sizeof(char( M))*N。非常快速的查找,没有开销(索引等)。对于不同长度的 VARCHARS,您无法使用如此简单有效的方法。
          【解决方案14】:

          区分两者也有利于完整性方面。

          如果您希望存储具有长度规则的事物,例如是或否,那么您可以使用 char(1) 来存储 Y 或 N。对于货币代码等事物也很有用,您可以使用 char(3)存储美元、欧元或澳元之类的东西。

          那么 varchar 更适用于除了限制之外没有关于长度的一般规则的情况。它适用于名称或描述等值的长度变化很大的情况。

          然后文本数据类型出现并在工作中使用了一个扳手(尽管它通常只是没有定义上限的 varchar)。

          【讨论】:

            【解决方案15】:

            Char有固定长度(支持2000个字符),代表character是一种数据类型

            Varchar 具有可变长度(支持 4000 个字符)

            【讨论】:

            • -1;这些数字对于 MySQL 是不正确的。 (我认为他们可能适用于甲骨文?)
            【解决方案16】:

            Char 或 varchar- 用于输入文本数据,长度可以用括号表示 例如 - 名称 char (20)

            【讨论】:

            • 这并没有解决原始问题。 OP 询问的是类型之间的实际差异,而不是类型的语法和用途。 () 也是括号,而不是括号。
            • @2mac 你的最后一句话只适用于美式英语;在英国,我们称之为() 括号,许多英国人可能甚至没有意识到在英语的方言中,“括号”这个词可以指一个标点符号。有充分的理由选择“括号”而不是“括号” - 总的来说,当针对国际程序员受众时,这可能是最明确的选择 - 但它比“括号”更复杂的情况只是错了。
            【解决方案17】:

            字符:

            • 支持字符和数字。
            • 支持 2000 个字符。
            • 固定长度。

            VARCHAR:

            • 支持字符和数字。
            • 支持 4000 个字符。
            • 可变长度。

            任何cmets......!!!!

            【讨论】:

              猜你喜欢
              • 2014-08-30
              • 2015-12-12
              • 2017-09-06
              • 1970-01-01
              • 1970-01-01
              • 2014-05-03
              • 2020-06-26
              • 2010-12-14
              相关资源
              最近更新 更多