新换行/换行前面的MS SQL反斜杠会删除换行符

时间:2012-06-05 15:35:22

标签: sql-server-2008 asp-classic escaping

我正在使用传统的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

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

2 个答案:

答案 0 :(得分:3)

我知道这已经过时了,但我刚刚看到一篇MS KB文章讨论过这个问题:http://support.microsoft.com/kb/164291/en-us。它的长和短是三个字符\<CR><LF>在一起是一些奇怪的转义序列,你需要在插入或更新时用\<CR><LF>替换所有出现的\\<CR><LF><CR><LF>因为第一个反斜杠在\\<CR><LF><CR><LF>中,转义了奇怪的转义序列,即接下来的三个字符\<CR><LF>,然后附加的<CR><LF>将回车放回原位。很烦人,是的。

答案 1 :(得分: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;

我不知道你是不是要让微软解决这个问题,不要特别对待这个字符序列,所以“修复”将会解决它。您可能还需要注意非传统的CR / LF,例如: CHR(10)或CHR(13)本身,或vbTab(Chr(9)))。