AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 292076
Accepted
Kamalakannan J
Kamalakannan J
Asked: 2021-05-23 11:04:39 +0800 CST2021-05-23 11:04:39 +0800 CST 2021-05-23 11:04:39 +0800 CST

当 varchar 更高效时,为什么数据库具有 char 数据类型?

  • 772

我了解占用固定长度的数据类型CHAR和占用空间的数据类型之间的基本区别是基于存储的内容。VARCHARCHARVARCHAR

但是,如果VARCHAR根据存储的内容动态处理空间管理如此有效,为什么数据库支持CHAR数据类型,所有CHAR(n)字段都可以是VARCHAR(n)字段,对吧?

datatypes storage
  • 2 2 个回答
  • 1019 Views

2 个回答

  • Voted
  1. Best Answer
    J.D.
    2021-05-23T12:35:09+08:002021-05-23T12:35:09+08:00

    您应该阅读这篇文章SQL varchar data type deep dive,特别是使用 SQL varchar 的存储和性能注意事项部分:

    由于字段长度固定,直接从列中提取数据而不进行任何数据操作,并且针对 varchar 的索引查找比 char 字段慢。CHAR 在性能方面优于 VARCHAR,但是,当数据没有固定长度时,它会占用不必要的内存空间。因此,在磁盘大小不是问题的情况下,建议使用 CHAR。

    请注意,这特别说明了从 Microsoft SQL Server 角度来看的差异,YMMV 用于其他数据库系统,并且并非所有都支持CHAR和VARCHAR数据类型(例如,SQLite 既没有数据类型,也只支持它所谓的TEXT数据类型)。

    从 MySQL 的角度来看,这里有一些很好的信息,由 RolandoMySQLDBA 提供 - DBA.StackExchange 回答What is the performance impact of using CHAR vs VARCHAR on a fixed-size field?:

    由于 CHAR 字段由于字段宽度固定而需要较少的字符串操作,因此针对 CHAR 字段的索引查找平均比 VARCHAR 字段快 20%。

    令人惊讶的是,在 PostgreSQL 领域,听起来似乎不存在相同的性能差异,因此数据类型之间的实际差异并不那么丰富。请参阅StackOverflow 对文本和 varchar 之间的差异(字符变化)的回答以及对 CHAR vs VARCHAR (Postgres)的索引性能的 DBA.StackExchange 回答:

    ...所有 4 种数据类型的插入和选择的性能相似。

    CHAR 和 VARCHAR 在 Postgres(和 Oracle)中的实现完全相同。使用这些数据类型时速度没有差异。

    • 6
  2. user3703276
    2021-05-23T22:32:14+08:002021-05-23T22:32:14+08:00

    我想用一个简单的例子来解释你需要在数据库中存储性别 可能的值 F、M、O 使用 char 每个条目(8 位)需要 1 个字节 使用 varchar 每个条目需要 1 个字节和 2 个字节(比如说 24 位)

    通过使用 char 你可以将数据库的大小减少到 33%

    • -1

相关问题

  • 如何在 PostgreSQL 中将货币列的类型更改为十进制?

  • Oracle 的 VARCHAR 和 VARCHAR2 数据类型有什么区别?

  • 从 NTEXT 迁移到 NVARCHAR(MAX)

  • 获取时间跨度之间的记录

  • INT(5) vs SMALLINT(5):数字类型后面括号中的数字

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve