我认识到,CHAR是建议,如果我所有价值观都是固定的宽度。但是,还等什么?为什么不直接VARCHAR的所有文本的领域是安全的。

有帮助吗?

解决方案

通常选择 CHAR 如果所有行将近 同样的长度.选择 VARCHAR长度各不相同 明显。焦炭还可以快一点,因为所有行的长度相同。

它不同的执行情况,但一般VARCHAR使用一个或两个字节的存储空间(长或终止)除实际数据。所以,(假设你正在使用的一个字符组)存储词"FooBar"

  • CHAR(6)=6字节(没有开销)
  • VARCHAR(10)=8个字节(2个字节的开销)
  • CHAR(10)=10个字节(4个字节的开销)

底线是 CHAR速度更快 和更多的 高效的空间 对数据的相对长度相同(在两个字符长度的差别)。

注意到:Microsoft SQL有2个字节的开销VARCHAR。这可从数据库的数据库,但一般至少有1个字节的开销必要的,以表明长或终止一VARCHAR。

正如所指出的,加文的意见,如果使用多字节变长字符集像UTF8然后炭储存的最大数字有必要存储的数字。因此,如果UTF8需要至多3个字节到商店的一个角色,然后CHAR(6)将固定在18字节,即使只存储latin1符。因此,在这种情况下VARCHAR成为一个更好的选择。

其他提示

如果你的工作与我和你的工作与Oracle,我可能会让你使用 varchar 几乎在每一种情况。假设 char 使用较少的处理能力比 varchar 可能是真的...现在...但数据库引擎获得更好的随着时间的推移,这种一般规则的决策的未来"神话".

另一件事:我从来没有见过一个业绩问题,因为有人决定要去 varchar.你会让很多更好地利用你的时间编写好的代码(较少的电话数据库)和高效的SQL(怎么做索引的工作,如何优化程序做出决定,是为什么 exists 速度比 in 通常...).

最后认为:我见过各种各样的问题与使用 CHAR, ,人们在寻找"的时候他们应该寻找'',或找人'FOO'时,他们应该寻找'FOO(堆空间这里的),或人不修剪后坯料,或者错误与开发增加到2000年的空白要的价值回报,从一个Oracle的程序。

除了性能的好处, CHAR 可以用来表明,所有价值观 应该 相同的长度,例如,列于美国国家的缩写。

Char是一点点的速度更快,所以如果你有一列,你知道会有一定的长度,使用char。例如,储存(M)ale/(F)emale/(U)二的性别,或者2人物为美国的一个州。

不仅必或Char更好地执行他们的var替代方案?

伟大的问题。简单的答案是肯定的,在某些情况下。让我们看看如果这可以解释的。

显然我们都知道,如果我创建一个表,列的varchar(255)(我们称该列myColumn),并插入一个亿行,但只有几个字符入myColumn的每一行,该表将要小得多(总人数数据页面所需要的储存引擎)的比,如果我创造了myColumn为char(255).随时随地我做的操作(仔)上,表和请求很多行,它将以更快的速度时myColumn是varchar因为我没有 移动 周围所有的那些"额外的"空间的结束。移动,作为在当SQL服务器不会内部各种各样,例如在一个不同的或联盟的操作,或者如果它选择一个合并过它查询计划等。移动也可能意味着所需的时间以获得数据从服务器到我的地方的电脑或另一计算机或无论它是要消耗。

但是有一些开销在使用varchar。SQL服务器已经使用两个字指标(开销),在每一行,知道有多少字节,特别是行的myColumn。这不是额外的2个字节提出的问题,它的有"码"数据的长度在myColumn上的每一个行。

在我经历它最有意义来使用炭,而不是varchar列将加入到在查询。例如的主要关键的一个表,或一些其他列将被编入索引。CustomerNumber在一个人口统计表,或CodeID上的码表,或者也许OrderNumber上的顺序表。通过使用炭,查询机可以更迅速地执行加入,因为它可以做的直接指针算法(确定),而不是将它移动的指针可变量的字节,因为它读取的网页。我知道我可能已经失去了你在这的最后一句。加入SQL服务器的基础的想法"谓词。" 一谓是一个条件。例如myColumn=1,或OrderNumber < 500.

因此,如果SQL服务器正在执行一个层次结构,并谓词,或"按键"正在连接上是一个固定长度(char),查询的引擎不要做很多工作要相匹配行从一个表行从另一个表中。它不会需要找出如何,只要数据是,在排,然后走下来串找到结束。所有需要时间。

现在记住这个可以容易地将难实现。我已经看到char用于主要关键领域的在线系统。宽度必须保持较小即char(15)或一些合理的。和它的工作最好的在线系统,因为你通常仅检索或插入一个小数目的行使具有"rtrim"这些后的空间你会获得的结果设定的是一个简单的任务而不是具有加入数以百万计的行一个表中的数以百万计的行在另一个表中。

另一个原因CHAR意义超过varchar网上系统是它减少了页的分裂。通过使用炭,你基本上是"保留"(和浪费),空间所以,如果一个用户来沿着后面,并把更多数据,列SQL已经分配空间并且在它去。

另一个原因使用CHAR是类似的第二的原因。如果一个程序员或用户没有"批量"的更新数以百万计的排,添加一句注意一个领域为例,你不会得到一个电话从你DBA在半夜想知道为什么他们的驱动是充分的。换句话说,它导致更多的可预测增长的大小的数据库。

因此,这些都是3种方式在线(只读)系统可以从中受益char过varchar。我几乎没有使用char在一个仓库/分析/OLAP种情况下,因为通常你有这么多的数据,所有这些char栏可以添加了很多浪费空间。

请记住,char可以让你的数据库很大,但最备用工具具有的数据压缩以备份往往是有关的大小相同,如果你使用了varchar。例如LiteSpeed或展鹏SQL备份。

另一种使用是在美景创建了进出口数据一个固定的宽度的文件。让我们说我要出口某些数据于一个平面文件的可读通过一个大型机。它是固定的宽度(不分隔的).我喜欢商店的数据在我的"临时"的表作为varchar(从而消耗较少的空间在我的数据库),然后使用,以铸造的一切,这就相当于炭,长度相当于该宽度的固定宽度,列。例如:

create table tblStagingTable (
pkID BIGINT (IDENTITY,1,1),
CustomerFirstName varchar(30),
CustomerLastName varchar(30),
CustomerCityStateZip varchar(100),
CustomerCurrentBalance money )

insert into tblStagingTable
(CustomerFirstName,CustomerLastName, CustomerCityStateZip) ('Joe','Blow','123 Main St Washington, MD 12345', 123.45)

create view vwStagingTable AS
SELECT CustomerFirstName = CAST(CustomerFirstName as CHAR(30)),
CustomerLastName = CAST(CustomerLastName as CHAR(30)),
CustomerCityStateZip = CAST(CustomerCityStateZip as CHAR(100)),
CustomerCurrentBalance = CAST(CAST(CustomerCurrentBalance as NUMERIC(9,2)) AS CHAR(10))

SELECT * from vwStagingTable

这是很酷因为在内部数据占用的空间更少,因为它是使用varchar。但是,当我使用DTS或SSIS或甚至只是一个剪切和粘贴从短程来的记事本,我可以使用图和得到正确数量的尾的空间。在DTS我们曾经有一个功能,该死,我忘记我认为这是所谓的"建议列"什么的。在SSIS你不能再这样了,你要不厌其烦地定义平的文件连接管理。但既然你有你的视图的设置、SSIS可以知道的宽度为每个柱,它可以节省很多时间建立数据流的任务。

因此底线...使用varchar。有一个非常小的数目的理由使用炭和它仅适用于业绩的原因。如果你有一个系统与hundrends的数以百万计的行你会看到一个明显的差异,如果所谓正确定性的(char),但对于大多数系统的使用炭只是在浪费空间。

希望这有所帮助。杰夫

有性能的好处,但这是一个没有被提及:行迁移。与炭,你准备金的整个空间提前。因此,让我们说你有一个char(1000)和储存10字符,将使用所有1000字数的空间。在varchar2(1000)中,你将只使用10字符。问题是当你修改的数据。我们说您更新列为现在包含900符。这是可能的空间扩大varchar是不是可以在当前的区块。在这种情况下,该数据库引擎必须迁移行为的另一个方框,并使指在原始框到新的行新的区块。要读这个数据,该数据库引擎会现在必须阅读2块。
没有人可以equivocally说,varchar或char更好。有空间时间的权衡,并考虑是否将数据更新,特别是如果有一个良好的机会,这将会增加。

之间是有区别的早期表现优化和使用最佳实践的种类型的规则。如果你正在创造新的表格,你总有一个固定长度的领域,它是有道理的使用炭,你应该用它在这种情况。这不是早期优化,而是实现规则的拇指(或最佳做法).

即-如果你有2个字母的国家领域,使用CHAR(2)条。如果你有一个领域的实际国家的名称,使用VARCHAR。

我会选择varchar除非列储存固定价值,像我们这样的国家代码-这是总是2个字符长和列表的有效我们的国家代码并不能改变往往:).

在其他每一种情况下,甚至像存储哈希令(它是固定长度),我会选择varchar。

为什么-char type列始终履行了空间,它使得列 my_column 定义为char(5)价值'ABC'内部比较:

my_column = 'ABC' -- my_column stores 'ABC  ' value which is different then 'ABC'

错误的。

功能 可能导致许多刺激性的错误在发展和试验,更难。

CHAR占用了较少的储存空间,比VARCHAR如果所有数值在这一领域都是相同的长度。现在也许在2009年有800GB数据库是相同的所有意图和目的作为一个810GB如果你转换的VARCHARs于字符,但对短串(1或2个字符)、炭仍然是一个行业"最佳做法"我会说。

现在如果你看一下各种数据类型的大多数数据库提供甚至对于整数单独(bit,小,int、bigint),有理由选择之一。简单地选择bigint每次实际上是被一位一无所知的目的和使用的领域。如果一个领域只是表示一个人的年龄在年来,bigint被矫枉过正。现在它不一定是"错误的",但它没有效率。

但是,它的一个有趣的论点,并作为数据库随着时间的推移有所改善,可以说CHAR vs VARCHAR并得到较少有关。

我站在吉姆McKeeth的评论。

此外,索引编制和完整的表格的扫描速度更快,如果你的表只有CHAR列。基本的优化程序将能够预测有多大的每一个记录是如果它只有CHAR列,而它需要检查的大小值每VARCHAR列。

此外,如果您更新VARCHAR列的尺寸大于其前面的内容可能力的数据库,以重建其索引(因为你迫使数据库,以实际行动,记录的磁盘上).同时CHAR列将永远不会发生。

但你可能不会关心性的打击,除非你表是巨大的。

记得Djikstra是明智的话。早期的性能优化的根源的所有邪恶。

许多人已经指出如果你知道确切长度的价值使用的炭有一些好处。但是,同时存储我们各国为CHAR(2)是很大的今天,当你得到的消息从销售,'我们只是做了我们的第一出售给澳大利亚的',你是在一个世界痛苦。我总是送到高估了多久,我认为领域需要,而不是作出'确切的'猜测用于支付未来事件。VARCHAR将给我更多的灵活性,在这个区域。

还有一些小的处理开销计算的实际需要的尺寸列的价值和分配的空间Varchar,所以如果你肯定知道该如何长价值总会,它是更好地利用炭和避免的撞击。

这是经典的空间,对业绩的权衡。

在MS SQL2005年,Varchar(或限为lanuagues需要两个字每个字即中国)是可变的长度。如果添加行之后已经写入硬盘就会找到的数据在一个非contigious位置的原始排和导致分裂的数据文件。这会影响性能。

因此,如果空间不是一个问题然后Char有更好的表现,但是如果你想保持该数据库的大小下来,然后varchars更好。

我认为在你的情况有可能是没有理由不接Varchar。它提供了灵活性和正如已经提到的由一些受访者中,性能是这样的,现在,除了在非常特殊的情况下,我们meer人(而不是谷歌DBA)不会发现其中的差别。

一个有趣的事情值得注意的时候DB类型是源码(一个受欢迎的小数据库有相当令人印象深刻的业绩)把一切都进入该数据库作为一串和类型的飞行。

我总是用VarChar,并且通常使其远远超过我可能会严格需要的。例如。50名字,因为你说的为什么不只是安全的。

碎片。炭储备空间和VarChar不。页面分可能需要适应更新varchar。

我永远不会使用字符。我有这个辩论很多的人和他们总是带来了累的陈词滥调,char是速度更快。嗯,我说,快多少?我们在谈论什么在这里,毫秒秒和如果是多少?你告诉我因为有人声称它是一个几毫秒的速度更快,我们应该介绍吨的难解决的错误入该系统吗?

因此,这里有一些问题,将运行为:

每个领域将要填补,所以你结束了代码永远具有RTRIMS无处不在。这也是一个巨大的磁盘空间的废物的长领域。

现在,让我们说你有典型的例子char领域只有一个字,但该领域是可选择的。如果有人传递一个空串到这场它成为一个空间。因此,当另一个应用程序/流程的查询,他们得到一个单一的空间,如果他们不使用rtrim.我们已经有xml文件,文件和其他程序,显示只是一个空间,可选择的领域,并打破东西。

所以现在你要保证你穿null和非空串,char领域。但那是不正确使用空。这里是使用的空。可以说您会获得一个文件从一个供应商

姓名、性别、城市

鲍勃||洛杉矶

如果性别是不指定比你进入鲍勃,empty string和洛杉矶入表中。现在可以说你得到的文件及其格式的变化和两性不再包括在内,但是在过去。

姓名|城市

鲍勃|西雅图

好了,现在因为性别不包括在内,我将使用空。Varchars支持这没有问题。

Char另一方面是不同的。你总是有发送空。如果你有没有发送空string,你将最终有一个领域具有空间。

我可以去上并在与所有的错误我不得不解决自字和在约20年的发展。

当使用varchar值SQL Server需要额外的2个字节每行储存的一些信息,列而如果使用炭它不需要那个 所以除非你

在一些SQL数据库,VARCHAR将填充到其最大尺寸,以便优化移,这是以加速充分表扫描和索引。

因此,没有任何节省空间的使用VARCHAR(200)相比CHAR(200)

使用CHAR(仅必)和VARCHAR(权限)带来的差别方式的数据库服务器中存储的数据。第一个引入了后坯;我有遇到问题时使用它与像操作员在SQL服务器的功能。所以我必须让它安全通过使用VARCHAR(权限)所有的时间。

例如,如果我们有一个表 测试(INT ID,状态CHAR(1)), 和你写的一功能清单的所有记录与一些特定的价值如下:

CREATE FUNCTION List(@Status AS CHAR(1) = '')
RETURNS TABLE
AS
RETURN
SELECT * FROM TEST
WHERE Status LIKE '%' + @Status '%'

在这一功能的,我们期望,当我们把缺省参数的功能将返回的所有行,但事实上,它不。改变@状况的数据类型来VARCHAR将解决这个问题。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top