我正在使用传统的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
如果反斜杠后跟除换行符以外的任何内容,我看不出任何问题。
答案 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)))。