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

leo*_*ora 293 sql sql-update sql-insert

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

Insert into Person
  (First, Last)
Values
  'Joe',
  'O'Brien'
Run Code Online (Sandbox Code Playgroud)

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

Pau*_*sik 447

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

INSERT INTO Person
    (First, Last)
VALUES
    ('Joe', 'O''Brien')
              /\
          right here  
Run Code Online (Sandbox Code Playgroud)

这同样适用于SELECT查询:

SELECT First, Last FROM Person WHERE Last = 'O''Brien'
Run Code Online (Sandbox Code Playgroud)

撇号或单引号是SQL中的一个特殊字符,用于指定字符串数据的开头和结尾.这意味着要将它用作文字字符串数据的一部分,您需要escape特殊字符.通过单引号,通常可以通过将报价加倍来实现.(两个单引号字符,不是双引号而不是单引号.)

注意:当您通过原始SQL接口手动编辑数据时,您应该只担心此问题,因为在开发和测试之外编写查询应该是罕见的.在代码中有一些技术和框架(取决于你的堆栈),它们负责转义特殊字符,SQL注入等.

  • $ linkQuestion = str_replace("'","''",$ linkQuestion);(天哪,这很难读!) (5认同)

Jus*_*ner 34

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

insert into Person (First, Last)
values ('Joe', 'O''Brien')
Run Code Online (Sandbox Code Playgroud)


Dav*_*all 20

你需要逃避撇号.在T-SQL中,这是一个双撇号,所以你的insert语句变为:

Insert into Person
(First, Last)
Values
'Joe', 'O''Brien'
Run Code Online (Sandbox Code Playgroud)


Max*_*gle 19

单引号通过加倍来转义

以下 SQL 说明了此功能。

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

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

select * from @person
Run Code Online (Sandbox Code Playgroud)

结果

First   | Last
===================
Joe     | O'Brien
Run Code Online (Sandbox Code Playgroud)


OMG*_*ies 14

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

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

看看使用REPLACE来清理传入的值:

您想检查''''并替换它们,如果它们存在于字符串中'''''',以便逃避单独的单引号.


Nat*_*han 8

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

Insert into Person
  (First, Last)
Values
  'Joe',
  concat('O',char(39),'Brien')
Run Code Online (Sandbox Code Playgroud)


小智 5

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

他(偶然地我确信)将重音符号作为字符串的分隔符而不是替换 O'Brian 中的撇号。对于大多数情况,这实际上是一个非常简单的解决方案。