如何设置字段的长度查询最快又节省空间?

如何设置字段的长度查询最快又节省空间? 
 
推荐数据库提供了36类字符数据类型—— char varchar 、text 
1. char  数据类型使用固定长度来存储字符,最长可以容纳8000个字符。利用 char 数据类型来定义表列或定义变量时,应该给定数据的最大长度。如果实际的字符长度短于给定的最大长充,刚多的字节会被空格填充。如果实际的多了,则被截断。(好处:可以精确计算数据占有的空间) 
2. varchar 是最长可以达到8000字符的变长字符型数据。它随存储在表列中的每一个数据的字符数的不同而变化。例如,定义表列为 varchar (20),那么存储在该列的数据最多可以长达20个字节,如没达到20个字节,并不会在多余的字节上填充空格。所以大部分时候都选择 varchar ,可以有效的节省空间,不浪费。(像你的要求,就写 varchar (2000)就行) 
补:书中说的100是指它最多不能超过100。 
3.text不常用,因为它是存储非常庞大的字符型数据的类型。当大于8000字节时,可以用text,它最大长度可以达到2的31次方减1个字符,约2G。 
强调:text也是变长字符数据。 
回答者: yokopan - 见习魔法师 二级   2-6 09:59
varchar 是可变字符, varchar (2000)即可,不会浪费空间。 
楼主为何要将历史记录存在access中呢?若您后台有sql server支持,建议您历史记录也存放在sql中,access的性能及对sql的语言支持都远不如 MSSQL。 
 
VARCHAR 限制了字符串的长度不能超过255个字符?】 ---哦,忘记了,这个可能access有此限制,sql可以的,最大varchar(8000)。 
varchar (100)中的100并不多余,在未存储数据时用于占位,系统会用于预先计划分配空间,但直到真正存储数据时才确实分配存储空间。 
 
个人看法: 
1.占用空间上 varchar (100)和 varchar (2000)没什么区别。 
2.但 varchar (100)会效率较低,因为按你说的该字段会5-2000,若大于100,则您每次固定写入100会需要多次写操作,众所周知写操作是比较耗时的。 
3.查询性能方面,跟您这儿怎么存没太大关系,重要的还是常见的数据库查询优化,如索引、条件等等 
 
 
对这个问题,我引用一下CSDN上的说法: 
 
一。数据行结构 
char (n): 系统分配n个字节给此字段,不管字段实际长度(后边用空格补齐) 
 
varchar (n): 假设表中有M个 varchar (或者nvarchar)类型的字段 
先分配两个字节(用来表示M) 
再分配2*M个字节(表示各变长行的偏移) 
此后字段值有多长,就分配多长 
 
二。 varchar (n)一定比 char (n)节省空间么? 
不一定。 
我见过这样的设计:  varchar (3) 
就算此字段为空,也还是比 char (3)多用一个字节。 
 
还有这样的设计: user_ip  varchar (16). 
对于这种数据长度变化不大的字段,用 varchar 只能浪费空间 
 
结论:  varchar 适用于数据值长度不太短,且长度变化较大的字段 
 
三。 char (n)一定比 varchar (n)速度快么? 
不一定 
计算 varchar 的偏移是会花去一些cpu时间,但性能瓶颈不在此,在io. 
db的io单位是数据页(8192字节)(一页存有多个数据行,数据行不能跨页。当然image,text等例外). 因此一页中行越多,性能越好 
 
 
另外,关于 char varchar 的性能比较, 
 
请参见该实验: 
http://www.yuanma.org/data/2006/0730/article_1266.htm 
 
 
再补充一下: 
 
[转帖] char nchar varchar 、nvarchar,对比那个好? 
 
数据库定义到 char 类型的字段时,不知道大家是否会犹豫一下,到底选 char nchar varchar 、nvarchar、 
text、ntext中哪一种呢?结果很可能是两种,一种是节俭人士的选择:最好是用定长的,感觉比变长能省些空 
间,而且处理起来会快些,无法定长只好选用定长,并且将长度设置尽可能地小;另一种是则是觉得无所谓, 
尽量用可变类型的,长度尽量放大些。 
 
鉴于现在硬件像萝卜一样便宜的大好形势,纠缠这样的小问题实在是没多大意义,不过如果不弄清它, 
总觉得对不起劳累过度的CPU和硬盘。 
 
下面开始了(以下说明只针对SqlServer有效): 
 
1、当使用非unicode时慎用以下这种查询: 
select  from  where  f = N 'xx' 
 
原因:无法利用到索引,因为数据库会将f先转换到unicode再和N 'xx' 比较 
 
2、 char  和相同长度的 varchar 处理速度差不多(后面还有说明) 
 
3、 varchar 的长度不会影响处理速度!!!(看后面解释) 
 
4、索引中列总长度最多支持总为900字节,所以长度大于900的 varchar char 和大于450的nvarchar, nchar 
将无法创建索引 
 
5、text、ntext上是无法创建索引的 
 
6、O/R Mapping中对应实体的属性类型一般是以string居多,用 char []的非常少,所以如果按mapping的 
合理性来说,可变长度的类型更加吻合 
 
7、一般基础资料表中的 name 在实际查询中基本上全部是使用 like  '%xx%' 这种方式,而这种方式是无法利用 
索引的,所以如果对于此种字段,索引建了也白建 
 
8、其它一些像remark的字段则是根本不需要查询的,所以不需要索引 
 
9、 varchar 的存放和string是一样原理的,即length {block}这种方式,所以 varchar 的长度和它实际占用 
空间是无关的 
 
10、对于固定长度的字段,是需要额外空间来存放 NULL 标识的,所以如果一个 char 字段中出现非常多的 NULL , 
那么很不幸,你的占用空间比没有 NULL 的大(但这个大并不是大太多,因为 NULL 标识是用 bit 存放的, 
可是如果你一行中只有你一个 NULL 需要标识,那么你就白白浪费1byte空间了,罪过罪过!),这时候, 
你可以使用特殊标识来存放,如: 'NV' 
 
11、同上,所以对于这种 NULL 查询,索引是无法生效的,假如你使用了 NULL 标识替代的话,那么恭喜你, 
你可以利用到索引了 
 
12、 char varchar 的比较成本是一样的,现在关键就看它们的索引查找的成本了,因为查找策略都一样, 
因此应该比较谁占用空间小。在存放相同数量的字符情况下,如果数量小,那么 char 占用长度是小于 varchar 
的,但如果数量稍大,则 varchar 完全可能小于 char ,而且要看实际填充数值的充实度,比如说 varchar (3) 
char (3),那么理论上应该是 char 快了,但如果是 char (10)和 varchar (10),充实度只有30%的情况下, 
理论上就应该是 varchar 快了。因为 varchar 需要额外空间存放块长度,所以只要length(1-fillfactor) 
大于这个存放空间(好像是2字节),那么它就会比相同长度的 char 快了。 
 
13、nvarchar比 varchar 要慢上一些,而且对于非unicode字符它会占用双倍的空间,那么这么一种类型 
推出来是为什么呢?对,就是为了国际化,对于unicode类型的数据,排序规则对它们是不起作用的, 
而非unicode字符在处理不同语言的数据时,必须指定排序规则才能正常工作,所以n类型就这么一点好处。 
 
 
总结陈词: 
1、如果数据量非常大,又能100%确定长度且保存只是ansi字符,那么 char 
2、能确定长度又不一定是ansi字符或者,那么用 nchar ; 
3、不确定长度,要查询且希望利用索引的话,用nvarchar类型吧,将它们设到400; 
4、不查询的话没什么好说的,用nvarchar(4000) 
5、性格豪爽的可以只用3和4,偶尔用用1,毕竟这是一种额外说明,等于告诉别人说,我一定需要长度 
为X位的数据 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值