1

这是重现问题的代码:

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”

4

1 回答 1

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

于 2013-09-06T10:16:19.687 回答