插入带有撇号的值的正确SQL语法是什么?

Insert into Person
  (First, Last)
Values
  'Joe',
  'O'Brien'

我一直得到一个错误,因为我认为O后面的撇号是值的结束标记。


当前回答

因为单引号用于表示字符串的开始和结束;你需要逃离它。

简单的回答是使用两个单引号- " -以便SQL数据库将值存储为'。

看一下使用REPLACE来清除传入值:

甲骨文取代 SQL Server REPLACE MySQL取代 PostgreSQL取代

您希望检查'''',如果它们存在于字符串中,则将它们替换为'''''',以便转义单个单引号。

其他回答

你需要省略撇号。在T-SQL中,这是一个双撇号,所以你的插入语句变成:

Insert into Person
(First, Last)
Values
'Joe', 'O''Brien'

因为单引号用于表示字符串的开始和结束;你需要逃离它。

简单的回答是使用两个单引号- " -以便SQL数据库将值存储为'。

看一下使用REPLACE来清除传入值:

甲骨文取代 SQL Server REPLACE MySQL取代 PostgreSQL取代

您希望检查'''',如果它们存在于字符串中,则将它们替换为'''''',以便转义单个单引号。

提供的解决方案是不工作的好,因为它广告字符串与两个单引号在数据库中,最简单的方法是使用反反斜杠之前撇号(单引号)。

Insert into Person  (First, Last) Values  'Joe',  'O\'Brien'

另一种转义撇号的方法是写一个字符串字面量:

insert into Person (First, Last) values (q'[Joe]', q'[O'Brien]')

这是一个更好的方法,因为:

假设您有一个包含1000个名称的Excel列表,您希望将其上传到数据库。您可以简单地创建一个公式,用单元格内容生成1000条INSERT语句,而不是手动查找撇号。 它也适用于其他转义字符。例如加载一个Regex模式值,即^(*)(P|N)?(*)|(*)((<|>)\d\d?)?( *)|( )(((? 我)(在|不是)(? -我 ) ?(('[^']+')(, ?'[^']+'))))?(*)$到表中。

单引号通过双引号转义,

下面的SQL说明了这个功能。

declare @person TABLE (
    [First] nvarchar(200),
    [Last] nvarchar(200)
)

insert into @person 
    (First, Last)
values
    ('Joe', 'O''Brien')

select * from @person

结果

First   | Last
===================
Joe     | O'Brien