如何对 SQL Server 中的单引号进行转义?

How do I escape a single quote in SQL Server?

提问人:tim_wonil 提问时间:10/19/2009 最后编辑:Oleg Valter is with Ukrainetim_wonil 更新时间:11/8/2023 访问量:1722859

问:

我正在尝试将一些文本数据放入 SQL Server 9 中的表中。insert

文本包括一个引号。'

我该如何逃避?

我尝试使用两个单引号,但它给我带来了一些错误。

例如。insert into my_table values('hi, my name''s tim.');

Server T-SQL 分隔符 引号

评论

51赞 llamaoo7 10/19/2009
“它给我带来了一些错误”——这些错误是什么?
2赞 MaxiWheat 10/19/2009
是的,因为在MSSQL中插入单引号的正确方法是将它们加倍。您向我们展示的示例应该有效。如何进行此SQL查询,使用哪种语言?还是在SQL Server Management Studio中?
1赞 Peter Mortensen 1/25/2016
SQL Server 中“替换单引号”的可能重复项。

答:

73赞 PaulMcG 10/19/2009 #1

怎么样:

insert into my_table values('hi, my name' + char(39) + 's tim.')
1920赞 Cᴏʀʏ 10/19/2009 #2

单引号可以通过加倍来转义,就像您在示例中向我们展示的那样。以下 SQL 演示了此功能。我在 SQL Server 2008 上对其进行了测试:

DECLARE @my_table TABLE (
    [value] VARCHAR(200)
)

INSERT INTO @my_table VALUES ('hi, my name''s tim.')

SELECT * FROM @my_table

结果

value
==================
hi, my name's tim.

评论

25赞 tim_wonil 10/19/2009
我找错了地方来解决问题。毕竟,这不是一个角色逃逸问题。我的问题是数据长度超出了限制。谢谢你向我保证,两次使用单引号是逃避角色的正确方法。
0赞 Vinicius Lima 2/15/2014
因此,如果我有一个包含 10k 个单词的文本,我有必要替换所有文本吗?
3赞 Cᴏʀʏ 2/16/2014
@ViniciusLima:简短的回答是肯定的。当然,这将根据您将用于存储数据的技术而改变。如果你使用的是 ORM,它会为你完成。如果要手动生成 SQL 命令,则需要使用该语言的“预准备语句”功能。如果在 Management Studio 中执行此操作,则必须执行替换。
1赞 Ujjwal Singh 4/28/2014
即两个单引号对一个。[''] => [']
18赞 Alex Martelli 10/19/2009 #3

报价的加倍应该起作用了,所以它对你不起作用很奇怪;但是,另一种方法是在字符串周围使用双引号字符,而不是单引号字符。即,

insert into my_table values("hi, my name's tim.");

评论

7赞 Lajos Mészáros 11/28/2017
如果文本同时包含单引号和双引号怎么办?另外,双引号不是只为字段名称保留的吗?
91赞 Brad303 9/6/2013 #4

如果用另一个单引号转义你的单引号对你不起作用(就像我最近的一个查询一样),你可以在查询之前使用,然后在查询之后使用。REPLACE()SET QUOTED_IDENTIFIER OFFSET QUOTED_IDENTIFIER ON

例如

SET QUOTED_IDENTIFIER OFF;

UPDATE TABLE SET NAME = REPLACE(NAME, "'S", "S");

SET QUOTED_IDENTIFIER ON;
-- set OFF then ON again

评论

3赞 Richard Moss 7/2/2015
通常我使用加倍方法,但是当我生成动态 SQL 然后在多个服务器和数据库上运行时,这个解决方案对我有用,而加倍在特定情况下则没有。谢谢你!
0赞 datagod 3/9/2017
在计算列上引用视图和索引时要小心,否则可能会出现错误。stackoverflow.com/questions/9235527/......
0赞 Edgar Allan Bayron 12/20/2017
@RichardMoss,+1。和你一样的情况。加倍方法是最初的解决方案。对于复杂的查询,如跨多个服务器的动态 SQL,这将起作用,加倍方法可能不起作用
4赞 donperk 3/23/2022
值得注意的是,对于外行来说,它改变了双引号的行为,而不是撇号的行为。具体而言,将其值设置为意味着可以使用双引号来分隔字符串。打开它(默认值)后,它用于分隔标识符(如列名),以便它们可以包含空格或 SQL 关键字。SET QUOTED_IDENTIFIEROFFON
6赞 Daniel Schmidt 9/2/2015 #5

另外需要注意的另一件事是它是否真的存储为经典的 ASCII ' (ASCII 27) 或 Unicode 2019(看起来相似,但不相同)。

这在插入方面没什么大不了的,但它可能意味着选择和更新的世界。
如果它是 unicode 值,那么在 WHERE 子句中转义 '(例如,where blah = 'Workers''s Comp')将返回,就像您正在搜索的值不存在一样,如果 “Worker's Comp” 中的 ' 实际上是 unicode 值。

如果您的客户端应用程序支持自由键以及基于复制和粘贴的输入,则在某些行中可能是 Unicode,而在其他行中可能是 ASCII!

确认这一点的一种简单方法是执行某种开放式查询,该查询将带回您正在搜索的值,然后将其复制并粘贴到记事本++或其他一些支持Unicode的编辑器中。

ascii 值和 unicode 值之间的不同外观应该是显而易见的,但如果您倾向于肛门,它将在十六进制编辑器中显示为 27 (ascii) 或 92 (unicode)。

评论

3赞 Rory 5/27/2021
请注意,单引号是 ,而不是 。27 是单引号的十六进制代码。39 是它的十进制代码。char(39)char(27)
0赞 Dave Kelly 11/5/2016 #6

这应该有效

DECLARE @singleQuote CHAR 
SET @singleQuote =  CHAR(39)

insert into my_table values('hi, my name'+ @singleQuote +'s tim.')
23赞 Xin 3/15/2017 #7

解决此问题的 2 种方法:


因为您可以简单地在字符串中将其加倍,例如 -- 将获得:'select 'I''m happpy'I'm happy


对于您不确定的任何字符:在 SQL Server 中,您可以通过以下方式获取任何字符的 unicode(您保留数字)select unicode(':')

所以这种情况你也可以select 'I'+nchar(39)+'m happpy'

-4赞 Chris Enitan 5/24/2019 #8

这应该有效:使用反斜杠并加上双引号

"UPDATE my_table SET row =\"hi, my name's tim.\";

评论

0赞 Muhammad Musavi 12/19/2019
你是什么意思?你是说这在SSMS中会起作用吗?它根本不起作用,也没有人告诉过它有效。PRINT \"hi, my name's tim.\";
0赞 laxman Thapa 6/25/2019 #9

只需在要插入的任何内容之前插入一个 '。它就像 sqlServer 中的转义字符

例: 当你有一个领域时,我很好。 您可以执行以下操作: UPDATE my_table SET row ='我很好';

评论

0赞 Michael MacAskill 6/25/2019
这不正是 OP 所做的吗,并且与得票最高的答案已经说过的一样?据推测,该错误一定有其他来源。
4赞 AlinPaul8806 9/24/2019 #10

以下语法将仅转义一个引号:

SELECT ''''

结果将是一个引号。可能对创建动态 SQL :)非常有帮助。enter image description here

66赞 Arulmouzhi 10/31/2019 #11

我们中的许多人都知道,转义单引号的流行方法是将它们轻松加倍,如下所示。

PRINT 'It''s me, Arul.';

Doubling the Single Quotes Method

我们将研究其他一些转义单引号的替代方法

1. UNICODE 字符

39 是单引号的 UNICODE 字符。因此,我们可以像下面这样使用它。

PRINT 'Hi,it'+CHAR(39)+'s Arul.';
PRINT 'Helo,it'+NCHAR(39)+'s Arul.';

UNICODE Characters

2. QUOTED_IDENTIFIER

另一个简单且最好的替代解决方案是使用 QUOTED_IDENTIFIER。 当 QUOTED_IDENTIFIER 设置为 OFF 时,字符串可以用双引号括起来。 在这种情况下,我们不需要转义单引号。 因此,在使用大量带单引号的字符串值时,这种方式将非常有帮助。 在使用如此多的 INSERT/UPDATE 脚本行时,这将非常有帮助,其中列值具有单引号。

SET QUOTED_IDENTIFIER OFF;
PRINT "It's Arul."
SET QUOTED_IDENTIFIER ON;

QUOTE_IDENTIFIER

结论

上述方法既适用于 AZURE 也适用于本地。

4赞 rchacko 7/23/2020 #12

双引号选项帮助了我

SET QUOTED_IDENTIFIER OFF;
insert into my_table values("hi, my name's tim.");
SET QUOTED_IDENTIFIER ON;
0赞 Fandango68 9/17/2020 #13

我遇到了同样的问题,但我的问题不是基于 SQL 代码本身中的静态数据,而是基于数据中的值。

此代码列出了我的数据库中的所有列名和数据类型:

SELECT DISTINCT QUOTENAME(COLUMN_NAME),DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS

但有些列名实际上在列名中嵌入了单引号!,例如...

[MyTable].[LEOS'DATACOLUMN]

为了处理这些,我必须使用 REPLACE 函数以及建议的QUOTED_IDENTIFIER设置。否则,当在动态 SQL 中使用该列时,这将是一个语法错误。

SET QUOTED_IDENTIFIER OFF;
    SET @sql = 'SELECT DISTINCT ''' + @TableName + ''',''' + REPLACE(@ColumnName,"'","''") + ...etc
SET QUOTED_IDENTIFIER ON;
-2赞 Craig - MSFT 4/8/2021 #14

STRING_ESCAPE功能可用于较新版本的 SQL Server

评论

6赞 norgie 5/5/2021
根据文档:“目前STRING_ESCAPE只能转义JSON特殊字符”
0赞 raiserle 9/16/2021
并且它不能用于逃逸'
0赞 Mansoor 11/8/2023 #15

只需在值前添加 N

insert into my_table values(N'hi, my name's tim.');