如何插入包含撇号(单引号)的值?


310

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

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

我一直遇到错误,因为我认为O后面的撇号是该值的结尾标记。


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

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

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

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

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

Answers:


485

在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注入等。


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

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


21

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

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

AFAIK Values必须将其用大括号括起来(然后使其与@JustinNiessner的答案相同)
qwerty_so 2015年

15

因为单引号用于指示字符串的开头和结尾;你需要逃脱它。

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

看一下使用REPLACE清理传入的值:

您想要检查'''',并替换它们(如果它们存在于字符串''''''中)以转义单独的单引号。


3

埃德菲有个好主意。在他的代码示例中,他只是倒退了。在JavaScript或SQLite中,都可以用重音符号代替撇号。

他(顺带一提,我确定)将重音符号作为字符串的分隔符,而不是替换奥布莱恩中的撇号。实际上,在大多数情况下,这是一个非常简单的解决方案。


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

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

3

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

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

2

将单引号加倍即可转义

以下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

0

在值周围使用双引号。

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

3
请注意,尽管我知道Informix(仅一个DBMS)允许使用,但它不再是标准SQL。您还应该解决如何插入字符串,例如He said, "Don't!"使用单引号和/或双引号-可以这样做:'He said, "Don''t!"'"He said, ""Don't!"""。在已接受的答案的长期存在的问题中添加新答案时,必须提供新的完整信息。使用双引号是新功能-但仅限于少数DBMS;您应该尽力找出至少一个接受的人。
乔纳森·勒夫勒

-1

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

`O'Brien`

1
然后问题就变成了:如何插入反引号?
贾斯珀·德弗里斯

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