SQL Server中的转义字符

152
我想使用带转义字符的引号。当一个特殊字符出现时,如何避免以下错误?

字符字符串后有未闭合的引号。


5
您能否请展示一下查询语句? - marc_s
4
可能是 如何在 SQL Server 中转义单引号? 的重复问题。 - Jens Schauder
9个回答

180

你可以这样转义引号:

select 'it''s escaped'

结果将会是

it's escaped

134

为了转义 ',您只需在其前面再加一个 '

正如第二个答案所示,可以像这样转义单引号:

select 'it''s escaped'

结果将会是

it's escaped
如果您正在将 SQL 拼接到 VARCHAR 中以执行(即动态 SQL),则建议对 SQL 进行参数化。这样可以帮助防止 SQL 注入,并且意味着您无需担心如此转义引号(通过将引号加倍处理)的问题。
例如,不要这样做:
DECLARE @SQL NVARCHAR(1000)
SET @SQL = 'SELECT * FROM MyTable WHERE Field1 = ''AAA'''
EXECUTE(@SQL)

试试这个:

DECLARE @SQL NVARCHAR(1000)
SET @SQL = 'SELECT * FROM MyTable WHERE Field1 = @Field1'
EXECUTE sp_executesql @SQL, N'@Field1 VARCHAR(10)', 'AAA'

31
为什么这个回答被接受了?它并没有回答问题。 - Emperor Eto
5
@PeterMoore:OP 要么会使用我回答中的第一部分(双引号重复,如下面其他答案所述),要么会使用我推荐的首选方法来构建字符串变量中的 SQL 查询——使用参数化 SQL。无论哪种方式,都是对问题的回答。 - AdaTheDev
它并没有回答问题。有时用户需要ODBC连接,这意味着您只能使用纯SQL。 - Tony
修改了答案,使其更清晰,并更好地适应问题。 - Revious

64
你可以定义你的转义字符,但只能在 LIKE 子句中使用。
示例:
SELECT columns FROM table
WHERE column LIKE '%\%%' ESCAPE '\'

这里将在整个字符串中搜索%,这就是如何在SQL Server中使用ESCAPE标识符的方法。


25

您只需在字符串内将 ' 替换为 ''

SELECT colA, colB, colC
FROM tableD
WHERE colA = 'John''s Mobile'

如果你要动态生成SQL语句,你也可以使用 REPLACE(@name, '''', '''''')

如果你想要在 like 语句内进行转义,那么你需要使用 ESCAPE 语法。

值得一提的是,如果你没有考虑到 SQL 注入攻击,那么你会留下安全隐患。更多信息可以在 Google 或者 http://it.toolbox.com/wiki/index.php/How_do_I_escape_single_quotes_in_SQL_queries%3F 上找到。


然而,dugokontov或RichardPianka的答案都没有相似的-1吗? - Seph
@MichaelMunsey 你自己试试吧:select ' 会返回错误 Unclosed quotation mark after the character string ''。我的回答中没有使用 ",只有两个 ',不确定为什么我的回答是唯一一个被踩的。 - Seph

15

在MSSQL中转义引号需要使用双引号,因此''""会分别生成一个转义的'"


4
WHERE username LIKE '%[_]d';            -- @Lasse solution
WHERE username LIKE '%$_d' ESCAPE '$';
WHERE username LIKE '%^_d' ESCAPE '^';

来自: SQL Server下划线转义


3

如果你想在SQL中避免用户输入的变量,可以像下面这样实现:

  Set @userinput = replace(@userinput,'''','''''')

现在,每个引号的出现都会为 @userinput 增加一个额外的单引号来进行转义。


-1

在编程中,您可以使用**\**字符来转义需要转义的值,例如: insert into msglog(recipient) values('Mr. O\'riely') select * from msglog where recipient = 'Mr. O\'riely'


-1
为了让代码易于阅读,您可以使用方括号[]来引用包含'的字符串或反之亦然。

这是不正确的。括号可以用于字段、表或模式名称中的非法字符。 - Jamie Marshall
是的,你说得对,它是针对对象名称而不是字符串内容的。我一定是读错了问题。 - Ben

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接