关于varchar类型长度的疑问

coleling 2010-10-29 03:02:13
DECLARE @s VARCHAR(10)
SET @s = 'I Love You'

DECLARE @s VARCHAR(8000)
SET @s = 'I Love You'

请达人指教一下哈,一个varchar类型的变量(如上@s),设定的长度长短不同,实际运行的时候对性能有没有影响?
如果有的话,影响哪些方面的性能,程度有多大?
...全文
441 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
王向飞 2010-10-29
  • 打赏
  • 举报
回复
也可以说是规范,这么说吧 你程序中都定义的是20个长度,你数据库取出来那么多,他程序也没处放啊,
程序中定义什么样的长度,一般数据库也就跟他定义一样的就可以了。这样显着规范,专业。。。。。
SQLCenter 2010-10-29
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 billpu 的回复:]

呵呵 基本内存是640k,64k也太少了
还记得那时候打dos游戏 一会报内存一会报内存不够 himem.sys ems切来切去,为了玩一个游戏机器重启5 6次家常便饭
[/Quote]

呵呵
SQLCenter 2010-10-29
  • 打赏
  • 举报
回复
定义50有没有影响呢,我真得想不出影响到底有多大。

不过定义恰当的长度确实是一个好习惯,你的头也不是故意挑刺,如果是我也会这样要求。
billpu 2010-10-29
  • 打赏
  • 举报
回复
呵呵 基本内存是640k,64k也太少了
还记得那时候打dos游戏 一会报内存一会报内存不够 himem.sys ems切来切去,为了玩一个游戏机器重启5 6次家常便饭
SQLCenter 2010-10-29
  • 打赏
  • 举报
回复
估计你老板以前玩过汇编或者DOS编程,64K基本内存,可以理解,精打细选。
王向飞 2010-10-29
  • 打赏
  • 举报
回复
可能你老板以前用过128M的电脑,对这个比较讲究,严谨。
coleling 2010-10-29
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 sqlcenter 的回复:]

OMG,贴这么多东西,真把楼主当白菜啊?
[/Quote]
今天头儿挑我的毛病,说我的语句cast(@i as varchar(50))--注:@i是int--中的50用多了,对性能有影响,应该20就够了;心里觉得他没事找事,很不爽,但也确实拿不准具体影响,因此找各位达人探讨一下。
还望不吝赐教。
SQLCenter 2010-10-29
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 zsh0809 的回复:]

varchar类型是用了多长,就分配多少内存,不管你定义有多长。
==============
对这个持保留意见,我觉得对内存肯定是有影响的,对硬盘大小根据实际来分割。
[/Quote]

你定义varchar(max),看看内存是不是少了2G。

大型对象特殊处理?OK,那一个非大型对象的字符变量最多也就8K,加上额外的开销10K,够了吧,对于目前的硬件能力说,10K小菜一碟。
SQLCenter 2010-10-29
  • 打赏
  • 举报
回复
OMG,贴这么多东西,真把楼主当白菜啊?
王向飞 2010-10-29
  • 打赏
  • 举报
回复
你说的是占用物理空间多少个字节长度,至于内存占多少,应该类似,只不过他用完就释放了。
「已注销」 2010-10-29
  • 打赏
  • 举报
回复
varchar类型是用了多长,就分配多少内存,不管你定义有多长。
==============
对这个持保留意见,我觉得对内存肯定是有影响的,对硬盘大小根据实际来分割。
dawugui 2010-10-29
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 coleling 的回复:]
那是不是可以说,在定义varchar变量的时候,定义的长度长短对内存什么的没有影响,根据实际赋值决定内存大小?[/Quote]

对于变量可以这么说。但是表中字段不能这么说。
「已注销」 2010-10-29
  • 打赏
  • 举报
回复
定义的长度不一样,对内存肯定是有影响的,要不然大家都定义最大长度好了。
1.将VARCHAR定义为最大长度,一个块能够存放的行数就会减少,因为数据库要为你将来的UPDATE预留空间。
2.实际的硬盘占用空间的确不受字段定义长度的影响,这也是理所当然的,应为是VARCHAR字段的特性。
coleling 2010-10-29
  • 打赏
  • 举报
回复
我刚刚搜了一下Google,在一个Oracle论坛上看到这样一段话:
Let us declare to variables as below:
v_empname CHAR2(10) := 'BILL';
v_depname VARCHAR2(10) := 'HRD';
the database allocates 10 bytes memory for v_empname and
just 3 bytes memory for v_deptname.
when a variable is declared varchar then the memory will be
allocated variably.

我的总结是:
char类型是定义多长,就分配多少内存,不管你实际用了多长。
varchar类型是用了多长,就分配多少内存,不管你定义有多长。
不知各位达人,以为然否?
coleling 2010-10-29
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 dawugui 的回复:]
不是,你定义后,只要不超过你的长度,用了多少就是多少。

假设:declare @s varchar(10)

set @s = 'abcedf'

那就用了6字节。

set @s = '1234567890'

那就用了10字节。

set @s = '12345678901234567890'

提示:分配的。。。什么不足,将截断。。。。,报错。
[/Quote]
那是不是可以说,在定义varchar变量的时候,定义的长度长短对内存什么的没有影响,根据实际赋值决定内存大小?
dawugui 2010-10-29
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 coleling 的回复:]
引用 1 楼 shaoliang520xi 的回复:

有吧。给10长度的话,默认就是分配10长度的空间,8000的话就是默认给8000的空间。。你用不到8000,内存里还有给你占用了8000呢。


这个,varchar变量是定义多长,内存就分配多大空间么?等赋初始值后会变回来么?
[/Quote]
不是,你定义后,只要不超过你的长度,用了多少就是多少。

假设:declare @s varchar(10)

set @s = 'abcedf'

那就用了6字节。

set @s = '1234567890'

那就用了10字节。

set @s = '12345678901234567890'

提示:分配的。。。什么不足,将截断。。。。,报错。
coleling 2010-10-29
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 shaoliang520xi 的回复:]

有吧。给10长度的话,默认就是分配10长度的空间,8000的话就是默认给8000的空间。。你用不到8000,内存里还有给你占用了8000呢。
[/Quote]

这个,varchar变量是定义多长,内存就分配多大空间么?等赋初始值后会变回来么?
heymal 2010-10-29
  • 打赏
  • 举报
回复
nvarchar是固定的?!!!
我觉得对于变量应该影响不大,但是对于字段,要看实际的数值的
dawugui 2010-10-29
  • 打赏
  • 举报
回复
[Quote=引用楼主 coleling 的回复:]
DECLARE @s VARCHAR(10)
SET @s = 'I Love You'

DECLARE @s VARCHAR(8000)
SET @s = 'I Love You'

请达人指教一下哈,一个varchar类型的变量(如上@s),设定的长度长短不同,实际运行的时候对性能有没有影响?
如果有的话,影响哪些方面的性能,程度有多大?
[/Quote]

如果仅仅是个变量的话,只要能适合(满足)你的需求,影响不大或者说没有影响。
「已注销」 2010-10-29
  • 打赏
  • 举报
回复
nchar 和 nvarchar (Transact-SQL)

字符数据类型(nchar 长度固定,nvarchar 长度可变)和 Unicode 数据使用 UNICODE UCS-2 字符集。

nchar [ ( n ) ]

n 个字符的固定长度的 Unicode 字符数据。n 值必须在 1 到 4,000 之间(含)。存储大小为两倍 n 字节。nchar 的 ISO 同义词为 national char 和 national character。

nvarchar [ ( n | max ) ]

可变长度 Unicode 字符数据。n 值在 1 到 4,000 之间(含)。max 指示最大存储大小为 2^31-1 字节。存储大小是所输入字符个数的两倍 + 2 个字节。所输入数据的长度可以为 0 个字符。nvarchar 的 ISO 同义词为 national char varying 和 national character varying。

注释

如果没有在数据定义或变量声明语句中指定 n,则默认长度为 1。如果没有使用 CAST 函数指定 n,则默认长度为 30。

如果列数据项的大小可能相同,请使用 nchar。

如果列数据项的大小可能差异很大,请使用 nvarchar。

sysname 是系统提供的用户定义数据类型,除了不可为空值外,在功能上与 nvarchar(128) 相同。sysname 用于引用数据库对象名。

为使用 nchar 或 nvarchar 的对象分配的是默认的数据库排序规则,但可使用 COLLATE 子句分配特定的排序规则。

SET ANSI_PADDING ON 永远适用于 nchar 和 nvarchar。SET ANSI_PADDING OFF 不适用于 nchar 或 nvarchar 数据类型。
加载更多回复(7)

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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