none
中文系统中stuff函数对binary的操作问题 RRS feed

  • 问题

  • 中文stuff对binary操作时,例如stuff(@binary1,100,1,@binary2).我想严格按照二进制字节顺序从100开始替换。但系统有时实际是从111或者123开始替换。显然sqlserver把@binary1中某些数据当作中文处理了,2个字节算一个字符。请问stuff如何严格按二进制字节顺序处理?

    2014年8月16日 6:51

答案

  • 测试了一下, 是正确的啊

    DECLARE @value varbinary(20)
    SET @value = CONVERT(varbinary(20), N'中a')
    SELECT
    	@value,
    	CONVERT(varbinary, STUFF(@value, 2, 1, 0x00)),
    	CONVERT(varbinary, STUFF(CONVERT(nvarchar(10), @value), 2, 1, 0x00))
    
    

    返回的结果:

    0x2D4E6100 -- 替换前的值
    0x2D006100 -- binary 的值,是从第二个字节
    0x2D4E0000 -- 字符串的情况下,是第二个字符

    • 已标记为答案 sgzwiz2 2014年8月18日 14:30
    2014年8月18日 1:29

全部回复

  • 测试了一下, 是正确的啊

    DECLARE @value varbinary(20)
    SET @value = CONVERT(varbinary(20), N'中a')
    SELECT
    	@value,
    	CONVERT(varbinary, STUFF(@value, 2, 1, 0x00)),
    	CONVERT(varbinary, STUFF(CONVERT(nvarchar(10), @value), 2, 1, 0x00))
    
    

    返回的结果:

    0x2D4E6100 -- 替换前的值
    0x2D006100 -- binary 的值,是从第二个字节
    0x2D4E0000 -- 字符串的情况下,是第二个字符

    • 已标记为答案 sgzwiz2 2014年8月18日 14:30
    2014年8月18日 1:29
  • 怪事。我那个几千字节的binary就是不正确,我写了个clr的自定义替换函数却不会出错。我还是不用系统函数了,全部用自定义clr函数解决。sqlserver的系统函数不公开源码,不知道这些系统函数黑箱子里做了啥,遇到问题累死。谢谢邹建。

    2014年8月18日 14:29