按位异或的话 左边不足的部分应该补0 再来计算 要不你再手动计算下?^(按位互斥 OR)
在 Transact-SQL 语句中,将两个给定的整型值转换为二进制表达式,对其执行按位互斥 OR 运算。语法
expression ^ expression参数
expression是任何有效的 Microsoft® SQL Server™ 表达式(表达式必须由整数数据类型分类中的任何数据类型组成,或者由 binary 或 varbinary 数据类型组成)。expression 是一个经过处理并转换为二进制数字以便进行位运算的整数。说明  在位运算中,只有一个 expression 可以是 binary 或 varbinary 数据类型。
结果类型
如果输入值为 int,则返回 int;如果输入值为 smallint,则返回 smallint;或者如果输入值为 tinyint,则返回 tinyint。注释
通过从两个表达式取对应的位,位运算符 ^ 在两个表达式之间执行按位逻辑异或运算。如果在输入表达式的当前正在被解析的位中,某个位(但不是两个位)的值为 1,则结果中位的值被设置为 1;如果两个位的值都为 0 或者都为1,那么结果中该位的值被清除为 0。位运算符 ^ 只可以用在具有整型数据类型分类的列上。如果左右表达式的整型数据类型不同(例如,左边 expression 的数据类型是 smallint,右边 expression 的数据类型是 int),那么较小的数据类型的参数将转换为较大的数据类型。在该示例中,数据类型为 smallint 的 expression 被转换为 int 数据类型。

解决方案 »

  1.   

    显然是将1001当作int数据类型参与计算了。
      

  2.   

    注意运算表达式中1001这个值隐式的数据类型为int。
    结果类型
    如果输入值为 int,则返回 int;如果输入值为 smallint,则返回 smallint;或者如果输入值为 tinyint,则返回 tinyint。
      

  3.   

    Declare @a varchar(8000),@b varbinary(8000),@c varbinary(8000),@d varbinary(8000) 
    declare @i int,@j bigint
    set @i=1001
    set @j=1001
    set @a='123456789'
     
    set @b=convert(varbinary(8000),@a) 
    set @c=@b^@i 
    set @d=@c^@i 
    set @a=convert(varchar(8000),@d) print @b 
    print @c 
    print @d 
    print @a print '-----------------------------'set @c=@b^@j
    set @d=@c^@j 
    set @a=convert(varchar(8000),@d) 
    print @b 
    print @c 
    print @d 
    print @a 
    /*
    0x313233343536373839
    0x36373BD0
    0x36373839
    6789
    -----------------------------
    0x313233343536373839
    0x3233343536373BD0
    0x3233343536373839
    23456789
    */
      

  4.   


    Declare @a INT,@b varbinary(8000),@c varbinary(8000),@d varbinary(8000)
    set @a=123456789
    set @b=convert(varbinary,@a) 
    set @c=@b^1001
    SET @d=(@b^1001)^1001
    set @a=convert(INT,@d) 
    print @b 
    print @c 
    print @d 
    print @A 
    0x075BCD15
    0x075BCEFC
    0x075BCD15
    123456789
    这样就对了,
    可是我把那个1001转换成VARBINARY再进行比竟然不对??
      

  5.   

    @a 一定要是varchar型的,因为传近来的不一定是整数.
    SQL77 的问题我也碰到了,不能转成varbinary在异或.libin_ftsafe ,如果用bigint也只有8位,而这里的长度如果大于8位就被截断了,跟int是类似的效果.
      

  6.   


     ^ 的位运算时用于两个整型数据之间运算的,因此最大支持到Bigint。
      

  7.   

    建议对字符串的异或以分块处理的方式来做:Declare @a varchar(8000),@b varbinary(8000),@c varbinary(8000),@d varbinary(8000) set @a='123456789' 
    set @b=convert(varbinary(8000),right(@a,4))         --取字符串的后四字节参与异或运算,运算的结果为INT类型
    set @c=@b^1001 
    set @d=@c^1001 
    set @a=left(@a,len(@a)-4)+convert(varchar(8000),@d) --将异或运算之后的字符串部分与未参与运算部分拼接 
    print @b 
    print @c 
    print @d 
    print @a /*
    0x36373839
    0x36373BD0
    0x36373839
    123456789
    */
      

  8.   


    不需要限制位数,简单一点,就是把字符串数据分成4字节或者8字节的数据块,分别与INT或者BIGINT数据类型作异或即可。
      

  9.   

    TO: libin_ftsafe 
    先分段然后异或是可行的.
    但是我无法把这样的几个二进制数据组合在一起,保存到一个二进制的字段中.
    并在需要解密的时候取出该字段中的二进制数据通过再次异或得到原始字符串.
    您对这个问题是否有其他的看法呢?