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

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


我一直收到错误消息,因为我认为O是结束标记后的撇号值。

评论

请确认您没有对SQL注入攻击开放。尽可能使用参数。

您正在使用哪种脚本语言?例如,PHP中有一些函数可以为您正确执行此操作。

在这里与Andrew达成一致:我希望这个问题仅涉及通过SQL客户端或“查询浏览器”等运行SQL,而实际上不在生产代码中的某个地方。不使用参数化语句是愚蠢的。

它实际上在代码中..如果我有一个参数化查询,我是否不必做同样的事情?

负。根据使用的数据库和驱动程序,参数的隔离可能会以不同的方式处理,但是参数化语句中的参数不需要转义。参见en.wikipedia.org/wiki/SQL_injection#Preventing_SQL_injection

#1 楼

在SQL中转义撇号(即,将单引号字符加倍):

INSERT INTO Person
    (First, Last)
VALUES
    ('Joe', 'O''Brien')
              /\
          right here  


SELECT查询也是如此:

SELECT First, Last FROM Person WHERE Last = 'O''Brien'



单引号或单引号是SQL中的特殊字符,用于指定字符串数据的开始和结束。这意味着要将其用作文字字符串数据的一部分,需要escape特殊字符。通常使用单引号将您的报价加倍。 (两个单引号字符,而不是双引号而不是单引号。)

注意:通过外部SQL查询编写数据时,应该只担心在通过原始SQL界面手动编辑数据时担心此问题。开发和测试应该很少见。在代码中,存在一些技术和框架(取决于您的堆栈),这些技术和框架负责转义特殊字符,SQL注入等。

评论


$ linkQuestion = str_replace(“'”,“''”,$ linkQuestion);(天哪,这很难看!)

–user462990
16年5月3日在13:52



如果数据是“插入到人(第一个,最后一个)”值“ Joe”,“父亲的商店”怎么办?

–vijesh
20 Mar 18 '20 at 11:52

如vijesh所述,如果您必须通过脚本执行此操作,则这无济于事。让我们假设字符串文字不变。那您如何使用它呢?

–user3091705
20-09-28在18:39

#2 楼

您只需要加倍单引号...

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


#3 楼

您需要转义撇号。在T-SQL中,它带有双撇号,因此您的insert语句变为:

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


评论


AFAIK值必须用大括号括起来(然后使其与@JustinNiessner的答案相同)

– qwerty_so
15年6月28日在14:28

#4 楼

因为单引号用于指示字符串的开头和结尾;您需要对其进行转义。

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

请参阅使用替换以清理传入的值:


Oracle REPLACE
SQL Server REPLACE
MySQL REPLACE
PostgreSQL REPLACE

您要检查'''',并用''''''替换它们是否存在于字符串中,以便转义单独的单引号。

#5 楼

可以通过调用带有撇号的ASCII表查找值39的CHAR函数来插入撇号字符。然后可以使用串联运算符将字符串值串联在一起。

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


#6 楼

eduffy有个好主意。他只是在他的代码示例中把它弄倒了。在JavaScript或SQLite中,都可以用重音符号替换撇号。

(我敢肯定,他把重音符号作为字符串的分隔符,而不是在O'Brian中替换了撇号) 。实际上,对于大多数情况而言,这是一个非常简单的解决方案。

评论


更好,更简单的解决方案,我的姓是O`Reilly!

– PhillipOReilly
18年11月6日在1:23

无论如何,建议使用转义字符。不小心:)自从我使用键盘的那天起。编写文档时,我无意中使用了重音符号来代替单引号。 (但是在代码中,我使用'作为字符标识符)。直到去年有人告诉我他的密码,而我却无法登录他的系统。直到数小时后我才将'作为'键入。

–学习者
19年4月11日在8:48



#7 楼


通过将单引号加倍来转义单引号,


下面的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


#8 楼

避免撇号的另一种方法是编写字符串文字:
insert into Person (First, Last) values (q'[Joe]', q'[O'Brien]')

这是一种更好的方法,因为:假设您有一个包含1000的Excel列表要上传到数据库的名称。您可以简单地创建一个公式以使用单元格内容生成1000条INSERT语句,而不用手动查找撇号。


它也适用于其他转义字符。例如,加载正则表达式模式值,即^(*)(P | N)?(*)|(*)((<|>)\ d \ d?)?(*)|()(((? )(in | not in)(?-i)?((''[^'] +')(,?'[^'] +')))))(* * $放入表格中。



评论


这是针对Oracle的答案吗?我在网上找不到有关使用SQL的任何信息,并且我所使用的PC不使用SSMS。找到了Microsoft SQL的链接?然后,如何插入她说的]'等?方括号的存在,并可能在其后加上一个勾号,是否告诉它打破了价值?

– Suamere
20-10-3在14:25

@Suamere,您好,我使用Oracle,所以我不得不在网上搜索以了解这是否特定于该……我对这个主题的了解很少。该文章建议它特定于Oracle。但是其他供应商可能会采用其他方法...

–丹尼尔·鲁斯特(Daniel Rust)
20-10-5在8:30



#9 楼

在值周围使用双引号。

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


评论


请注意,尽管我知道Informix(仅一个DBMS)允许使用,但它不再是标准SQL。您还应该解决如何插入字符串的问题,例如他说的:“不要!”使用单引号和/或双引号-可以做到:“他说,“不要!””或“他说,“不要!””。在已接受的答案的长期存在的问题中添加新答案时,必须提供新的完整信息。使用双引号是新功能-但仅限于少数DBMS;您应该尽力确定至少一个接受的人。

–乔纳森·莱弗勒(Jonathan Leffler)
17年5月30日在7:23



#10 楼

请使用反引号(在〜键上);

`O'Brien`


评论


然后问题就变成了:如何插入反引号?

–Jasper de Vries
17年4月24日在8:46

尽管这不是“正确”的答案,但我正在使用一组没有此名称的名称,并且正在执行一次关闭操作,因此这立即解决了我的问题。谢谢!

–nscalf
20 Mar 16 '20在14:41