如何在SQL Server中转义单引号?


956

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

文本包含一个单引号(')。

我该如何逃避呢?

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

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


30
“这给我带来了一些错误”-这些错误是什么?
llamaoo09年

是的,因为在MSSQL中插入单引号的正确方法是将它们加倍。您展示给我们的示例应该可以正常工作。如何使用哪种语言进行此SQL查询?还是在SQL Server Management Studio中?
MaxiWheat

1
SQL Server中“ 替换单引号”的可能重复项。
彼得·莫滕森

Answers:


1387

单引号可以通过加倍来转义,就像您在示例中向我们展示的一样。以下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.

16
我在找错地方解决我的问题。毕竟这不是角色逃脱的问题。我的问题是数据长度超出限制。感谢您向我保证,两次使用单引号是转义字符的正确方法。
tim_wonil

因此,如果我的文本包含1万个单词,是否有必要替换所有文本?
Vinicius Lima 2014年

3
@ViniciusLima:简短的回答是。当然,这将改变,具体取决于您将用于存储数据的技术。如果您使用的是ORM,它将为您完成。如果要手动构建SQL命令,则需要使用该语言的“预备语句”功能。如果要在Management Studio中进行操作,则必须进行替换。
Cᴏʀʏ

1
即两个单引号一个。[''] => [']
Ujjwal Singh 2014年

67

如果用另一个单引号将单引号转义对您不起作用(例如,对于我最近的REPLACE()查询中的一种无效),则可以SET QUOTED_IDENTIFIER OFF在查询之前使用,然后SET QUOTED_IDENTIFIER ON在查询之后使用。

例如

SET QUOTED_IDENTIFIER OFF;

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

SET QUOTED_IDENTIFIER ON;
-- set OFF then ON again

2
通常,我使用加倍的方法,但是当我生成动态SQL并随后跨多个服务器和数据库运行时,此解决方案对我有用,而在一种特定情况下,加倍却没有。谢谢你!
理查德·莫斯

在引用计算列上的视图和索引时要小心,否则可能会出错。 stackoverflow.com/questions/9235527/…–
datagod

@ RichardMoss,+ 1。与您相同的情况。加倍的方法是最初的解决方案。对于跨多个服务器的动态SQL之类的复杂查询,此方法将奏效,加倍方法可能不起作用
Edgar Allan Bayron


17

报价加倍本来可以奏效,所以它对您不起作用很奇怪。但是,另一种方法是在字符串周围使用双引号而不是单引号。即

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


4
如果文本同时包含单引号和双引号怎么办?另外,难道双引号不只保留字段名称吗?
Lajos Meszaros

11

解决此问题的2种方法:


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


对于任何字符,您都不确定:在sql server中,您可以通过获取任何char的unicode select unicode(':')(保留数字)

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


6

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

这在插入内容上没什么大不了的,但这可能意味着选择和更新的世界。
如果它是unicode值,则在WHERE子句中转义'(例如,blah ='Workers's Comp')将返回,就像如果“ Worker's Comp”中的“ unicode值。

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

一种简单的确认方法是执行某种开放式查询,该查询将带回您要搜索的值,然后将其复制并粘贴到notepad ++或其他支持unicode的编辑器中。

ASCII值和unicode值之间的不同外观应该对眼睛来说很明显,但是如果您偏向肛门,则在十六进制编辑器中它将显示为27(ascii)或92(unicode)。


4

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

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

将单引号方法加倍

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

1.UNICODE字符

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

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

UNICODE字符

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和本地。


1

以下语法将使您只使用一个引号:

SELECT ''''

结果将是单引号。对于创建动态SQL可能会很有帮助:)。 在此处输入图片说明


0

这应该工作

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

insert into my_table values('hi, my name'+ @singleQuote +'s tim.')

0

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

示例:当您有一个字段as时,我很好。您可以这样做:UPDATE my_table SET row ='我很好。';


这不就是OP所做的,是否与最受好评的答案相同?大概一定有其他错误源。
Michael MacAskill

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.