这是重新产生问题的代码:
DECLARE @VBIN BINARY(50)
DECLARE @PASS NVARCHAR(3)
DECLARE @TEXT NVARCHAR(MAX)
SET @TEXT = '123456123789'
SET @PASS = '123'
SET @VBIN = CONVERT(BINARY, N'321')
SELECT REPLACE(@TEXT, @PASS, CONVERT(NVARCHAR(MAX), @VBIN))
会回来 '321'不是'321456321789'
答案 0 :(得分:1)
问题是,binary(50)
将填充0x00
以达到50的固定长度,并且通常将其视为字符串终结符。
您会看到与
相同的行为SELECT N'The quick brown ' + NCHAR(0) + N' fox jumped over the lazy dog.'
REPLACE
之后数据实际上仍然存在。它试图将其显示为发生截断的字符串。
DECLARE @VBIN BINARY(50)
DECLARE @PASS NVARCHAR(3)
DECLARE @TEXT NVARCHAR(MAX)
SET @TEXT = '123456123789'
SET @PASS = '123'
SET @VBIN = CONVERT(BINARY, N'321')
SELECT REPLACE(@TEXT, @PASS, CONVERT(NVARCHAR(MAX), @VBIN))
SELECT DATALENGTH(REPLACE(@TEXT, @PASS, CONVERT(NVARCHAR(MAX), @VBIN))) /*112*/
SELECT CAST(REPLACE(@TEXT, @PASS, CONVERT(NVARCHAR(MAX), @VBIN)) AS VARBINARY(112))
使用varbinary
而非binary
可以避免此问题,但我不确定您到底在做什么。