我正在阅读article。它说:
该字符以值%uff1c表示。如果将此值传递给SQL数据库中的varchar字段,则它将转换为实际的<字符。我没有在nvarchar字段上看到这项工作
好吧,我认为这是一个SQL Server错误,而不是ValidateRequest hack!如果我写%uff1c
,SQL Server必须将其保存为%uff1c
。或者,至少,它应该由admin选择的字符集“再次”编码%uff1c
。
我错了吗?
答案 0 :(得分:2)
这不是一个错误,而是一个功能(但你不能使用它)。
文章的重点是:如果你想发布一个包含'&lt;'的字符串,请转换每个&lt;到<(Unicode代码点FF1C)以避免验证错误。
SQL Server收到包含<的Unicode字符串,并尝试处理它。如果表列或过程参数的数据类型启用了Unicode(NCHAR,NVARCHAR,每个字符2个字节),则不会进行任何转换,SQL Server会存储原始值。
但是,如果将值传递给VARCHAR(每个字符1个字节)列或变量,则字符<(2字节代码点)将转换为&lt;。扩展AakashM的代码来说明:
DECLARE @nv nvarchar, @v varchar
SET @nv = N'<'
SET @v = '<'
SELECT @nv, @v, CONVERT(varchar, @nv)
< < <
但是,由于这是21世纪,数据库应该能够支持每种标准化的语言和符号和字符,因此很少有情况可以证明使用VARCHAR数据。
答案 1 :(得分:1)
SQL Server无法在<{1}}字段中存储<。在这种情况下你想发生什么:
varchar
(请注意,<不是通常的左尖括号字符,而是带有代码点DECLARE @v varchar(1)
SET @v = '<'
SELECT @v
的Unicode字符)。
以上结果为FF1C
(通常的左尖括号字符)。如果你想说这是一个错误,你应该说出期望的结果是什么。