DECLARE @str varchar(200)SET @str='中国汉字'  select datalength(@str)我期望的结果是8,为什是4呢,datalength不是算字节数吗?

解决方案 »

  1.   

    DECLARE @str varchar(200) SET @str='中国汉字' select datalength(@str) ,len(@str)/*
                
    ----------- -----------
    8           4(1 行受影响)
    */
      

  2.   

    没有啊,我用len和Datalength都是4
    备注:我用的是SQL server 2005
      

  3.   

    DECLARE @str varchar(200) SET @str=N'中国汉字' 
    select datalength(@str) 
    select len(@str)
    /*
    -----------
    6(1 row(s) affected)
    -----------
    4(1 row(s) affected)
    我的居然是6 
    =_=!
    */
      

  4.   

    我在查询分析器里这样写的啊:
    DECLARE @str varchar(200)SET @str='中国汉字'  select datalength(@str) as byteNumberResults
    -----------------------------------------------
        byteNumber
    1     4
      

  5.   

    可能和sql字符集有关?
    SELECT CONVERT (varchar, SERVERPROPERTY('collation'))
    /*------------------------------
    Chinese_PRC_CI_AS
    */--加个N试试?
    DECLARE @str varchar(200) SET @str=N'中国汉字' select datalength(@str) 
      

  6.   

    SELECT CONVERT (varchar, SERVERPROPERTY('collation'))我的是
    ----------------------------
    SQL_Latin1_General_CP1_CI_AS
      

  7.   

    DECLARE @str varchar(200) SET @str=N'中国汉字' select datalength(@str) 
    加了一个N结果还是4当然nvarchar的话,结果就是8了
      

  8.   

    估计是字符集的问题吧。
    你的是拉丁语系,存取汉字很容易造成乱码……
    还是全部用nvarchar保险
      

  9.   

    显示为4,再DECLARE @str varchar(200)SET @str='中国汉字'select @str
    看看是不是??就知道了。
      

  10.   

    高手,隐藏的够深的啊
    select @str 
    结果是???
    那么改变排序规则就可以了?
      

  11.   

    对于现已存放的数据,改变排序规则,没有什么效果,因为入库时,编码时找不到相应字符编码,就已是乱码了(关健时入库时是否在此规则下找到了相应的编码并插入,找不到就以?代替)。对于新存放的数据是可以的。比如你将库或列排序规则改为 chinese_rpc_ci_as 那么再执行,将会是 8不同的排序规则就会支持varchar类型里插入相应的字符编码。最好是用nvarchar.因为有可能,你改成chinese... 如果存德文,韩文,日文 ,同样它们会乱码。反过来,你应用德文,日文等相应的规则,存他们不乱码,而中文又会乱码。nvarchar是通用的解决之道。如果你的系统不涉及多语言环境, 那么可以考滤用varchar,并指定相应的排序规则。