我意识到,如果我所有的值都是固定宽度,建议使用CHAR.但是,那又怎样?为安全起见,为什么不为所有文本字段 Select VARCHAR呢.

推荐答案

一般的规则是,如果所有行都接近same length,则 Select CHAR.当length varies显著时, Select VARCHAR(或NVARCHAR).CHAR也可能会快一点,因为所有行的长度都相同.

它因DB实现而异,但通常情况下,VARCHAR(或NVARCHAR)除了实际数据之外,还使用一个或两个以上的存储字节(用于长度或终止).所以(假设您使用的是一个单字节字符集)存储单词"FooBar"

  • CHAR(6)=6字节(no overhead)
  • VARCHAR(100)=8字节(2 bytes of overhead)
  • CHAR(10)=10字节(4 bytes of waste)

对于长度相对相同(在两个字符长度差内)的数据,底线是CHAR can be fasterspace-efficient以上.

Note:Microsoft SQL有2字节的VARCHAR开销.这可能因DB而异,但通常,至少需要1字节的开销来指示VARCHAR上的长度或EOL.

正如100在 comments 中指出的那样:当涉及到multi-byte characters组时,情况会发生变化,在这种情况下,VARCHAR成为更好的 Select .

A note about the declared length of the 101:因为它存储了实际内容的长度,所以不会浪费未使用的长度.因此,在VARCHAR(6), VARCHAR(100), or VARCHAR(MAX)中存储6个字符使用相同的存储量.阅读有关使用VARCHAR(MAX)时的差异的更多信息.在VARCHAR中声明maximum大小,以限制存储量.

在 comments 中,AlwaysLearning指出Microsoft Transact-SQL docs的说法似乎正好相反.我认为这是一个错误,或者至少文件不清楚.

Sql相关问答推荐

将SEMI JOIN、ANTI JOIN转换为非连接SQL

如何优化我的功能以减少花费的时间?

按每天的最大值分组

我可以在SQLite3中使用BLOB作为主键吗?

HAVING子句内部过滤的正确方法

SQL到Snowflake-转换嵌套的SELECT(值

PostgreSQL:查找继承表中的特定记录属于哪个表

删除所有订单中可用的重复值

不存在记录的国外关键点

用另一个表中的特定名称替换 SQL 查询中的 ID.但我的两个表都有多个列

根据具有特定值的 ID 创建自定义组

MySQL中的递归查询邻接表深度优先?

SQL Server:时态表并在运行时添加计算列

PostgreSQL - 从同一张表中获取值

Select 字段,除非另一个字段包含重复项

添加一列并根据其他列值进行填充

MIN MAX 值与条件绑定

来自 SQL Server 的树层次 struct 图的 JSON

SQL 查询以填充单个列中的所有值

PostgreSQL Select 具有两列的自引用