declare @aa varchar(25)declare @bb int
select @aa = '000000000010'select @bb = LEN(@aa)select @bb这样返回的是12,就是实际有多少个char 元素
declare @aa char(25)declare @bb int
select @aa = '000000000010'select @bb = LEN(@aa)select @bb这样返回的是25,
请问为什么有这样的差异,他们还有别的差异吗??

解决方案 »

  1.   

    char 和 varchar
    固定长度 (char) 或可变长度 (varchar) 字符数据类型。char[(n)]长度为 n 个字节的固定长度且非 Unicode 的字符数据。n 必须是一个介于 1 和 8,000 之间的数值。存储大小为 n 个字节。varchar[(n)]长度为 n 个字节的可变长度且非 Unicode 的字符数据。n 必须是一个介于 1 和 8,000 之间的数值。存储大小为输入数据的字节的实际长度,而不是 n 个字节。所输入的数据字符长度可以为零。
      

  2.   

    那么,如果用char
    declare @aa char(25)declare @bb int
    select @aa = '000000000010'有办法获得这个12吗,还是必须用varchar
      

  3.   

    char长度不足时后面补空格,varchar的后面的空格都会自动删除,长度不足也会补
      

  4.   

    RTRIM
    截断所有尾随空格后返回一个字符串。语法
    RTRIM ( character_expression ) 参数
    character_expression由字符数据组成的表达式。character_expression 可以是常量、变量,也可以是字符或二进制数据的列。返回类型
    varchar
      

  5.   

    用trim了也没用declare @aa char(25)declare @bb int
    select @aa = '000000000010'select @aa = LTRIM(@aa )
    select @aa = RTRIM(@aa)
    select @bb = LEN(@aa)select @bb
    这样还是25啊还是要用varchar
      

  6.   

    没让你将rtrim的结果再赋值给@aa,那样系统又会转换为char,又会把后面的空格加上的
    你直接这样
    select @bb = len(rtrim(@aa))
      

  7.   

    如果系统需要,改成varchar也好
      

  8.   

    char长度不足时后面补空格,varchar的后面的空格都会自动删除,长度不足也会补-------------------------
    好像写错了,应该是:char长度不足时后面补空格,varchar的后面的空格都会自动删除,长度不足也不会补
      

  9.   

    char, nchar 是定长的
    varchar, nvarchar 是变长的
      

  10.   

    declare @aa char(25)declare @bb int
    select @aa = '000000000010'select @bb = LEN(@aa)select @bb这个反回的也是12,大家有没有去试一下!真是晕
    char varchar说只是存储的时候不一样,char是安固定长度来存储的,而varchar是实际长度来存储
      

  11.   

    declare @aa char(25),@bb varchar(25)set @aa = '10'
    set @bb = '10'
    select len(@aa) length_a,len(@bb) length_b
    ---------------------------------------------
    length_a length_b
    2 2
      

  12.   

    是啊,lz的25我的sql2k得不到阿
      

  13.   

    char 长度固定,长度不够,用空格替代
    varchar 长度可变,长度不够,不用空格替代
    char比varchar所消耗的系统资源要多。
      

  14.   

    char 固定长度
    varchar 可变长度
      

  15.   

    vchar 更灵活啊,节省存储空间啊
      

  16.   

    declare @str char(100)
    set @str='abc'select len(@str)这个结果是多少?不是100,而是3!
    为啥?因为len函数是忽略文本后的空格的!
    LEN
    返回给定字符串表达式的字符(而不是字节)个数,其中不包含尾随空格。语法
    LEN ( string_expression ) 参数
    string_expression要计算的字符串表达式。返回类型
    int
      

  17.   

    楼上说的有理我在SQL2K下
    declare @aa varchar(25)
    declare @bb int
    select @aa = '000000000010'
    select @bb = LEN(@aa)
    select @bb
    这样返回的是12,
    declare @aa char(25)
    declare @bb int
    select @aa = '000000000010'
    select @bb = LEN(@aa)
    select @bb
    这样返回的是12,
    ‘===============
    都是12,可能是用了len()返回给定字符串表达式的字符(而不是字节)个数,其中不包含尾随空格。相当于trim(expression)了吧,楼主怎么结果不同呢?
      

  18.   

    不过前面人关于char 和 varchar讨论区别很正确
      

  19.   

    LEN
    返回给定字符串表达式的字符(而不是字节)个数,其中不包含尾随空格。语法
    LEN ( string_expression ) 参数
    string_expression要计算的字符串表达式。返回类型
    int
      

  20.   

    楼主,告诉你一个小窍门:
    一般数据的长度不经常发生变化时用char,例如:性别如果经常发生变化就用varchar,例如:姓名char是定长的,空间不会改变,但效率高
    varchar是变长的,可以节省内存空间,但是降低效率
      

  21.   

    为什么我执行
    declare @aa char(25)
    declare @bb int
    select @aa = '000000000010'
    select @bb = LEN(@aa)
    select @bb
    这个还是12呢?
    我是在sql server 2k下
      

  22.   


    LEN函数
    返回给定字符串表达式的字符(而不是字节)个数,其中不包含尾随空格。这是原因。
    其实变量本身在char和varchar长度是不同的.
      

  23.   

    declare @aa varchar(15)
    declare @aaa char(15)
    declare @bb int
    declare @bbb int
    declare @cc char(1)set @aa = '1234567890'
    set @aaa = '1234567890'
    set @cc = 'e'set @bb = len(@aa+@cc)
    set @bbb = len(@aaa+@cc)
    select @bb
    select @bbb这个例子可以说明问题。
    在每个变量后面加一个字符,使len()不截断空格。
      

  24.   

    vchar 更灵活啊,节省存储空间,所以我一般用这种类型...
      

  25.   

    借地提个问题:在位数都足够的情况下,varchar(100)和varchar(1000)的时间空间效率是否完全一样?如果完全一样,那以后所有的varchar都声明成最大的长度了,因为“在位数都足够的情况下”的假设不一定可以保证~
      

  26.   

    char(n)固定长度,因此读写效率较高。
    varchar(n)是根据内容决定存储长度,肯定要消耗相关计算的时间。至于varchar中n的取值多少是否对效率的影响不同,我的考虑是:有区别。
    毕竟程序要先开辟n个BYTE的空间,然后再根据实际缩短,可能会影响到存储空间的管理和调配。否则,微软做varchar就没必要给出自定义长度的功能了。相信微软自有道理。个人观点。