Insert into Person
(First, Last)
Values
'Joe',
'O'Brien'
我一直收到错误消息,因为我认为O是结束标记后的撇号值。
#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
评论
请确认您没有对SQL注入攻击开放。尽可能使用参数。您正在使用哪种脚本语言?例如,PHP中有一些函数可以为您正确执行此操作。
在这里与Andrew达成一致:我希望这个问题仅涉及通过SQL客户端或“查询浏览器”等运行SQL,而实际上不在生产代码中的某个地方。不使用参数化语句是愚蠢的。
它实际上在代码中..如果我有一个参数化查询,我是否不必做同样的事情?
负。根据使用的数据库和驱动程序,参数的隔离可能会以不同的方式处理,但是参数化语句中的参数不需要转义。参见en.wikipedia.org/wiki/SQL_injection#Preventing_SQL_injection