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

tim*_*nil 882 sql t-sql sql-server delimiter single-quotes

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

该文本包括单引号(').

我怎么逃避?

我尝试使用两个单引号,但它给我一些错误.

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

Cᴏʀ*_*ᴏʀʏ 1284

单引号通过将它们加倍来进行转义,就像您在示例中向我们展示的那样.以下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
Run Code Online (Sandbox Code Playgroud)

结果

value
==================
hi, my name's tim.
Run Code Online (Sandbox Code Playgroud)

  • 我正在寻找错误的地方来解决我的问题.毕竟,这不是一个角色逃避问题.我的问题是数据长度超过了限制.感谢向我保证,使用单引号两次是逃避角色的正确方法. (15认同)
  • @ViniciusLima:简短的回答是肯定的.当然,这会改变,具体取决于您将用于存储数据的技术.如果您正在使用ORM,它将为您完成.如果您手动构建SQL命令,则需要使用该语言的"预准备语句"功能.如果您在Management Studio中执行此操作,则必须执行替换. (3认同)

小智 64

如果使用另一个单引号转义单引号不适合您(就像我最近的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
Run Code Online (Sandbox Code Playgroud)

  • 对于外行来说,值得注意的是“SET QUOTED_IDENTIFIER”改变了双引号的行为,而不是撇号的行为。特别是,将其值设置为“OFF”意味着可以使用双引号来分隔字符串。当它设置为“ON”(默认)时,它用于分隔标识符,例如列名,以便它们可以包含空格或 SQL 关键字。 (4认同)
  • 通常我使用doubled up方法,但是在我生成动态SQL然后在多个服务器和数据库中运行的地方,这个解决方案对我有效,而在一个特定情况下加倍没有.谢谢你! (2认同)

Pau*_*McG 41

怎么样:

insert into my_table values('hi, my name'+char(39)+'s tim.')
Run Code Online (Sandbox Code Playgroud)

  • 请改用char(39) (18认同)

Ale*_*lli 17

引用的加倍应该是有效的,所以它对你不起作用是特殊的; 但是,另一种方法是在字符串周围使用双引号字符而不是单引号字符.也就是说,

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

  • 如果文本包含单引号和双引号怎么办?另外,不是仅为字段名保留双引号吗? (4认同)

Aru*_*zhi 9

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

PRINT 'It''s me, Arul.';
Run Code Online (Sandbox Code Playgroud)

加倍单引号方法

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

1. UNICODE 字符

39 是单引号的 UNICODE 字符。所以我们可以像下面那样使用它。

PRINT 'Hi,it'+CHAR(39)+'s Arul.';
PRINT 'Helo,it'+NCHAR(39)+'s Arul.';
Run Code Online (Sandbox Code Playgroud)

UNICODE 字符

2. QUOTED_IDENTIFIER

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

SET QUOTED_IDENTIFIER OFF;
PRINT "It's Arul."
SET QUOTED_IDENTIFIER ON;
Run Code Online (Sandbox Code Playgroud)

QUOTE_IDENTIFIER

结论

上述方法适用于 AZURE 和 On Premises 。


Xin*_*Xin 8

解决此问题的2种方法:


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


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

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


Dan*_*idt 6

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

这对于插入来说并不是一件大事,但它可能意味着选择和更新世界.
如果它是unicode值,那么在WHERE子句中转义'(例如,在blah ='Workers''sComp'中)将返回,就像你正在搜索的值一样,如果'in"Worker's Comp"实际上是unicode值.

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

确认这一点的一种简单方法是通过某种开放式查询来恢复您要搜索的值,然后将其复制并粘贴到notepad ++或其他一些支持unicode的编辑器中.

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

  • 请注意,单引号是“char(39)”,而不是“char(27)”。27 是单引号的十六进制代码。39 是它的十进制代码。 (3认同)