SQLServer2005 varchar 长度 问题

人生就是赌 2010-03-26 02:06:16
SQLServer2005 中数据类型
varchar 长度最大可以到8000
其存储策略是按需存储 例如有300字节就使用300字节 另外有两个字节存储内容的偏移
我的问题是
既然这样 那我们设计时都把varchar设为8000行么?
反正是按需存储
就是不知道性能上有否影响?
...全文
4350 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
pwroselove 2012-03-24
  • 打赏
  • 举报
回复
nvarchar(MAX)到底有多长啊?
hoseakoon 2011-10-27
  • 打赏
  • 举报
回复
学习一下
cxmcxm 2010-03-26
  • 打赏
  • 举报
回复
长度除了存储的原因,更多是管理的需要。如身份证号码21位,如长度超出,数据即不能插入
feixianxxx 2010-03-26
  • 打赏
  • 举报
回复
通过行结构 可以看到无论你定义的VARCHAR()是多长
只要你插入的实际长度是一样的,那么它就存这么长。
所以没有性能差别
lrjt1980 2010-03-26
  • 打赏
  • 举报
回复
可能存在存取速度的问题。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
ShenLiang2025 2010-03-26
  • 打赏
  • 举报
回复



0)
DECLARE @str varchar(MAX)
SET @str = REPLICATE('*',8003)
SELECT LEN(@str)

1)
--------------------
8000

(1 row(s) affected)

喜-喜 2010-03-26
  • 打赏
  • 举报
回复
设置为varchar(8000)的话容易产生不可利用的空闲磁盘块儿,这不太经济!
大量不可利用的空闲磁盘块儿加剧数据的分散存储,在一定程度上影响了数据库各方面的性能!
lihengquan_1_ 2010-03-26
  • 打赏
  • 举报
回复
SQLServer2005 中数据类型
varchar 长度最大可以到8000
--这是不对的,SQL2005varchar最大长度可到2G字节.
Mr_Nice 2010-03-26
  • 打赏
  • 举报
回复
路过,学习....
sych888 2010-03-26
  • 打赏
  • 举报
回复
varchar(max)
xman_78tom 2010-03-26
  • 打赏
  • 举报
回复
如果 varchar(300) 和 varchar(8000) 都存储相同的字符数,性能上是没有差别的,存储行为上也没有不同。因为它们都有相同的存储结构,两个字节的偏移,两个字节的列数(如果表中所有的列都是 varchar 类型)。区别只在于存储容量上。

大多数的性能比较都集中在 varchar 和 char,varchar 和 varchar(max) 上。还有,行外存储(SQL Server 2005 支持的)。
人生就是赌 2010-03-26
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 xman_78tom 的回复:]
varchar(max) (lob 类型)与 varchar 存储方式是不同的。
当 LOB 数据足够小时,可以考虑将数据直接存储在数据行(行所在的数据页面)中,从而可以避免额外的读取 LOB 页面,提升访问 LOB 数据的效率(将 LOB 数据直接存储在数据页面的阈值由 text in row 选项设置)。
而当 LOB 数据大于此阈值,或者所在行的大小超过了 8060 字节(单行最大 SI……
[/Quote]
目前我的问题是
行内数据 8000 的 问题
从空间使用上来看,要考究char nchar等类型的长度
平时设计时也会考虑varchar长度,但是当研究inside SQLServer2005 存储引擎时 既然varchar 的行内数据存储是我上面所说的那种,那么究竟性能怎么样,不知道有没有朋友考究?
xman_78tom 2010-03-26
  • 打赏
  • 举报
回复
varchar(max) (lob 类型)与 varchar 存储方式是不同的。
当 LOB 数据足够小时,可以考虑将数据直接存储在数据行(行所在的数据页面)中,从而可以避免额外的读取 LOB 页面,提升访问 LOB 数据的效率(将 LOB 数据直接存储在数据页面的阈值由 text in row 选项设置)。
而当 LOB 数据大于此阈值,或者所在行的大小超过了 8060 字节(单行最大 SIZE),LOB 数据将会存储在 LOB 页面,而在数据页面中保留一个指向 LOB 页面的 16 字节的指针。其访问效率当然会将低。

另外还有,恶意用户可以利用这一点“撑爆”你的磁盘。
yhtapmys 2010-03-26
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 xys_777 的回复:]
SQL code
【IT168技术文档】
本次测试的SQL SERVER 2000 的char 与 varchar。

测试分三组,每次增加插入的行数,脚本如下:
CREATE TABLE [dbo].[testchar] (
[a] [int] IDENTITY (1, 1) NOT NULL ,
[b] [char] (200) COLLATE Chinese_……
[/Quote]

顶这个
占空间
永生天地 2010-03-26
  • 打赏
  • 举报
回复
【IT168技术文档】
本次测试的SQL SERVER 2000 的char 与 varchar。

测试分三组,每次增加插入的行数,脚本如下:
CREATE TABLE [dbo].[testchar] (
[a] [int] IDENTITY (1, 1) NOT NULL ,
[b] [char] (200) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[testvarchar] (
[a] [int] IDENTITY (1, 1) NOT NULL ,
[b] [varchar] (200) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
GO
--truncate table testvarchar
--truncate table testchar
declare @i as int
set @i=0
while @i<50000
begin
insert into testvarchar values(cast(@i as varchar(200)))
set @i=@i+1
if @i=50000
break
end
declare @i as int
set @i=0
while @i<50000
begin
insert into testchar values(cast(@i as char(200)))
set @i=@i+1
if @i=50000
break
end


实验结果:

插入行数
数据类型
Cpu
duration

50000
varchar
2359
21203

50000
char
2344
22250

100000
varchar
4156
44500

100000
char
4172
44186

2000000
varchar
8907
89093

2000000
char
9188
96530


两表存储空间比较
Testchar:73.94M
Testvarchar:7.94M
--小F-- 2010-03-26
  • 打赏
  • 举报
回复
另外 2005最大的是varchar(max)
可以存储2G
--小F-- 2010-03-26
  • 打赏
  • 举报
回复
按照实际需求来 别全部设置成为8000 那样会造成空间的浪费
htl258_Tony 2010-03-26
  • 打赏
  • 举报
回复
SQLServer2005 中数据类型
varchar 长度最大可以到8000
--这是不对的,SQL2005varchar最大长度可到2G字节.

既然这样 那我们设计时都把varchar设为8000行么?
反正是按需存储
就是不知道性能上有否影响?
--没有仔细测试,影响不大,建议按需设计.
SQL77 2010-03-26
  • 打赏
  • 举报
回复
VARCHAR(MAX)够用了
sql_sf 2010-03-26
  • 打赏
  • 举报
回复
2005最大是varchar(max)
设计时候
按需要分配吧
不要全varchar(8000)

34,594

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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