问题是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
可以避免这个问题,但我不确定你到底想在这里做什么。