关于变长字类型和定长类型的区别

computerstarveling 2003-09-13 09:05:55
定长类型和变长类型有什么区别,各有什么优点和缺点,大家谈谈自己的看法吧.
...全文
354 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
a1n1 2003-10-04
  • 打赏
  • 举报
回复 1
以前好用varchar的,不知道效率上有什么区别,
现在看了各位的解释感觉还是要看情况
伍子V5 2003-10-03
  • 打赏
  • 举报
回复 1
char是定长字符类型,速度快
varchar是变长字符类型,空间小
其实我们应该有这么一个思想
如果你要用varchar,实际字符长度由计算机判断,那就肯定要消耗更多的时间
所以在设计中如果我们自己能够确定的事
千万不要让计算机去做
肯定会消耗更多的时间
pengdali 2003-10-03
  • 打赏
  • 举报
回复 1
一般做主键用char,具体用什么要看你的情况。对于变化小的数据尽量使用char。
txlicenhe 2003-10-03
  • 打赏
  • 举报
回复 1
基本能确定长度,且长度相对固定的字段如:单号,编号之类的用定长
否则用变长,如:备注(太长要用text),规格说明之类,占用空间少。
welyngj 2003-10-03
  • 打赏
  • 举报
回复
char虽然需要更多的硬盘空间。但速度快
wzh1215 2003-09-14
  • 打赏
  • 举报
回复
varchar类型会占用系统资源,应尽量少用!
zjcxc 2003-09-14
  • 打赏
  • 举报
回复
变长一般用来保存数据长度不固定的数据.占用的存储空间跟所保存的数据的长度一致
定长一般用来保存数据长度固定的数据.占用的存储空间与字段定义的长度致
happy_0325 2003-09-14
  • 打赏
  • 举报
回复
在你的值的位数比较确定的时候用char
变化比较大的时候用varchar
computerstarveling 2003-09-13
  • 打赏
  • 举报
回复
可是听说varchar类型的会占系统资源,可我想知道比较确切的情况,比如到底会多占多少,影响系统运行是否有一个边界限度,最好在哪种情况下用或者不用.
CrazyFor 2003-09-13
  • 打赏
  • 举报
回复
如果你是固定长度的数据就用CHAR类型,如果要保存的数据只能确定它的最大长度时,就用VARCHAR.
保存方式:
CHAR类型:总是占用固定长度的字节数,当数据不足长度时后面补空格.
VARCHAR类型:总是占用数据长度加1个字节数.
段结构 允许NULL值的段,数据库在进行比较操作时,会先判断其是否为NULL,非NULL时才进行值的必对。因此基于效率的考虑,所有段均不能为空,即全部NOT NULL; 预计不会存储非负数的段,例如各项id、发帖数等,必须设置为UNSIGNED类型。UNSIGNED类型比非UNSIGNED类型所能存储的正整数范围大一倍,因此能获得更大的数值存储空间; 存储开关、选项数据的段,通常使用tinyint(1)非UNSIGNED类型,少数情况也可能使用enum()结果集的方式。tinyint作为开关段时,通常1为打开;0为关闭;-1为特殊数据,例如N/A(不可用);高于1的为特殊结果或开关二进制数组合(详见Discuz!中相关代码); MEMORY/HEAP类型的表中,要尤其注意规划节约使用存储空间,这将节约更多内存。例如cdb_sessions表中,就将IP地址的存储拆分为4个tinyint(3) UNSIGNED类型段,而没有采用char(15)的方式; 数据库设计的性能与效率全文共6页,当前为第1页。任何类型的数据表,段空间应当本着足够用,不浪费的原则,数值类型段取值范围见下表: 数据库设计的性能与效率全文共6页,当前为第1页。 类型 存储空间(b) UNSIGNED 取值范围 tinyint 1 否 -128~127 是 0~255 smallint 2 否 -32768~32767 是 0~65535 mediumint 3 否 -8388608~8388607 是 0~16777215 int 4 否 -2147483648~2147483647 是 0~4294967295 bigint 8 否 -9223372036854775808~9223372036854775807 是 0~18446744073709551615 SQL语句 所有SQL语句中,除了表名、段名称以外,全部语句和函数均需大写,应当杜绝小写方式或大小写混杂的写法。例如select * from cdb_members;是不符合规范的写法。 很长的SQL语句应当有适当的断行,依据JOIN、FROM、ORDER BY等关键进行界定。 通常情况下,在对多表进行操作时,要根据不同表名称,对每个表指定一个1~2个母的缩写,以利于语句简洁和可读性。 如下的语句范例,是符合规范的: $query = $db->query("SELECT s.*, m.* FROM {$tablepre}sessions s, {$tablepre}members m WHERE m.uid=s.uid AND s.sid='$sid'); 定长变长表 包含任何varchar、text等变长段的数据表,即为变长表,反之则为定长表。 对于变长表,由于记录大小不同,在其上进行许多删除和更改将会使表中的碎片更多。需要定期运行OPTIMIZE TABLE以保持性能。而定长表就没有这个问题; 如果表中有可变长段,将它们转换为定长段能够改进性能,因为定长记录易于处理。但在试图这样做之前,应该考虑下列问题: 使用定长列涉及某种折衷。它们更快,但占用的空间更多。char(n) 类型列的每个值总要占用n 个节(即使空串也是如此),因为在表中存储时,值的长度不够将在右边补空格; 而varchar(n)类型的列所占空间较少,因为只给它们分配存储每个值所需要的空间,每个值再加一个节用于记录其长度。因此,如果在char和varchar类型之间进行选择,需要对时间与空间作出折衷; 变长表到定长表的转换,不能只转换一个可变长段,必须对它们全部进行转换。而且必须使用一个ALTER TABLE语句同时全部转换,否则转换将不起作用; 数据库设计的性能与效率全文共6页,当前为第2页。有时不能使用定长类型,即使想这样做也不行。例如对于比255符更长的串,没有定长类型; 数据库设计的性能与效率全文共6页,当前为第2页。 在设计表结构时如果能够使用定长数据类型尽量用定长的,因为定长表的查询、检索、更新速度都很快。必要时可以把部分关键的、承担频繁访问的表拆分,例如定长数据一个表,非定长数据一个表。例如Discuz!的cdb_members和cdb_memberfields表、cdb_forums和cdb_forumfields表等。因此规划数据结构时需要进行全局考虑; 进行表结构设计时,应当做到恰到好处,反复推敲,从而实现最优的数据存储体系。 运算与检索 数值运算一般比符串运算更快。例如比较运算,可在单一运算中对数进行比较。而串运算涉及几个逐节的比较,如果串更长的话,这种比较还要多。 如果串列的值数目有限,应该利用普通整型或emum类型来获得数值运算的优越性。 更小的

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧