1

我正在使用经典的 ASP 并试图简单地将一些用户输入插入到我的 MS SQL 2008 数据库中。这是我基本上每天都在做的事情,但我认为我以前从未经历过这个错误。

我得到的错误是,如果用户以反斜杠结束一行文本,并在下面开始一个新行,则在数据存储到数据库后,反斜杠和换行符都会丢失。

如果我尝试以下语句,从 ASP 文件硬编码:

UPDATE TBLarticle_text SET Introduction = 'Text on first line \" & vbCrLf & " text on second line' WHERE ArticleGuid = 28

结果数据没有反斜杠或换行符。如果存储在变量中并打印在页面上,则该字符串是正确的。

这是示例用户输入(通常来自表单,但并不真正相关)。输入:

Text on first line \
text on second line

...存储为:

Text on first line  text on second line

如果反斜杠后跟换行符以外的任何内容,我看不到任何问题。

4

2 回答 2

3

我知道这很旧,但我刚刚看到一篇讨论此问题的 MS 知识库文章:http: //support.microsoft.com/kb/164291/en-us。总而言之,这三个字符加\<CR><LF>在一起是一些奇怪的转义序列,在插入或更新时需要将所有出现的 替换为\<CR><LF>因为\\<CR><LF><CR><LF>第一个反斜杠转义了奇怪的转义序列,\\<CR><LF><CR><LF>即接下来的三个字符\<CR><LF>附加<CR><LF>项将回车符放回原位。烦人,是的。

于 2014-01-13T16:49:44.763 回答
0

我看到了类似的问题。我想说解决此问题的最佳方法是不要让 ASP 将此类字符串传递给 SQL Server。您可以通过简单地替换该字符序列并在这一行的末尾注入一个空格来清理它(用户不太可能注意到):

sql = REPLACE(sql, "\" & vbCrLf, "\ " & vbCrLf)

您不必使用 ASP 或 VBScript 来观察此行为:

CREATE TABLE #floobar(i INT, x VARCHAR(255));

INSERT #floobar SELECT 1, 'foo \
bar';
INSERT #floobar SELECT 2, 'foo \\
bar';
INSERT #floobar SELECT 3, 'foo 
bar';

SELECT * FROM #floobar;

我不知道您是否会让 Microsoft 修复此问题以不将此字符序列视为特殊,因此“修复”将解决它。您可能还需要注意非传统的 CR/LF,例如 CHR(10) 或 CHR(13) 本身,或者 vbTab (Chr(9)))。

于 2012-06-05T15:56:14.540 回答