ChatGPT解决这个技术问题 Extra ChatGPT

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

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

该文本包含一个单引号 '

我该如何逃避呢?

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

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

“它给我带来了一些错误”——这些错误是什么?
是的,因为在 MSSQL 中插入单引号的正确方法是将它们加倍。您向我们展示的示例应该有效。您如何使用哪种语言进行此 SQL 查询?还是在 SQL Server Management Studio 中?
Replace single quotes in SQL Server 的可能重复项。

C
Cᴏʀʏ

正如您在示例中向我们展示的那样,单引号通过将它们加倍来进行转义。以下 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.

我正在寻找错误的地方来解决我的问题。毕竟这不是字符转义问题。我的问题是数据长度超过了限制。感谢您向我保证,两次使用单引号是转义字符的正确方法。
那么,如果我的文本包含 10k 个单词,是否有必要替换所有文本?
@ViniciusLima:简短的回答是肯定的。这当然会根据您将用于存储数据的技术而改变。如果您使用的是 ORM,它会为您完成。如果您手动构建 SQL 命令,您将需要使用该语言的“准备好的语句”功能。如果您在 Management Studio 中执行此操作,则必须进行替换。
即两个单引号一个。 [''] => [']
M
Malachi

如果用另一个单引号转义您的单引号对您不起作用(就像它不适用于我最近的一个 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

通常我使用加倍的方法,但是在我生成动态 SQL 的地方,然后在多个服务器和数据库中运行,这个解决方案对我有用,而在一个特定情况下加倍没有。谢谢你!
在计算列上引用视图和索引时要小心,否则可能会出错。 stackoverflow.com/questions/9235527/…
@RichardMoss,+1。和你一样的情况。加倍的方法是最初的解决方案。对于跨多个服务器的动态 SQL 等复杂查询,这将起作用,加倍方法可能不会
值得注意的是,SET QUOTED_IDENTIFIER 改变了双引号的行为,而不是撇号的行为。特别是,将其值设置为 OFF 意味着可以使用双引号来分隔字符串。当它变成 ON(默认值)时,它用于分隔标识符,如列名,以便它们可以包含空格或 SQL 关键字。
D
Dale K

怎么样:

insert into my_table values('hi, my name' + char(39) + 's tim.')

A
Arulmouzhi

我们中的许多人都知道转义单引号的流行方法是像下面这样轻松地将它们加倍。

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

https://i.stack.imgur.com/rLIBL.jpg

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

1. UNICODE 字符

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

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

https://i.stack.imgur.com/fztj8.jpg

2. QUOTED_IDENTIFIER

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

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

https://i.stack.imgur.com/V5orX.jpg

结论

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


X
Xin

解决此问题的 2 种方法:

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

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

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


A
Alex Martelli

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

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


如果文本同时包含单引号和双引号怎么办?另外,双引号不是只为字段名保留的吗?
D
Daniel Schmidt

另外要注意的另一件事是它是否真的存储为经典的 ASCII ' (ASCII 27) 或 Unicode 2019(看起来相似,但不一样)。这对插入来说没什么大不了的,但它可能意味着选择和更新的世界。如果它是 unicode 值,则在 WHERE 子句中转义 '(例如 where blah = 'Workers''s Comp')将返回,如果“Worker's Comp”中的 ' 实际上是Unicode 值。如果您的客户端应用程序支持自由键以及基于复制和粘贴的输入,则它可能在某些行中是 Unicode,而在其他行中可能是 ASCII!确认这一点的一种简单方法是执行某种开放式查询,该查询将带回您正在搜索的值,然后将其复制并粘贴到 notepad++ 或其他一些支持 unicode 的编辑器中。 ascii 值和 unicode 值之间的不同外观应该是显而易见的,但如果你靠近肛门,它会在十六进制编辑器中显示为 27 (ascii) 或 92 (unicode)。


请注意,单引号是 char(39),而不是 char(27)。 27 是单引号的十六进制代码。 39 是它的十进制代码。
A
AlinPaul8806

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

SELECT ''''

https://i.stack.imgur.com/7eaUv.png


r
rchacko

双引号选项帮助了我

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

D
Dave Kelly

这应该工作

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

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

F
Fandango68

我有同样的问题,但我的不是基于 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;

C
Craig - MSFT

STRING_ESCAPE 函数可用于较新版本的 SQL Server


根据文档:“目前 STRING_ESCAPE 只能转义 JSON 特殊字符”
它不能用于转义 '
l
laxman Thapa

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

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


这不正是 OP 所做的,并且与投票最多的答案已经说过的相同吗?据推测,一定有其他一些错误来源。
C
Chris Enitan

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

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

你是什么意思?您是说 PRINT \"hi, my name's tim.\"; 将在 SSMS 中工作?它根本不起作用,也没有人告诉过它起作用。