407

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

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

我不断收到错误消息,因为我认为 O 之后的撇号是该值的结束标记。

4

11 回答 11

617

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

于 2009-12-16T03:35:58.787 回答
50

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

insert into Person (First, Last)
values ('Joe', 'O''Brien')
于 2009-12-16T03:36:55.290 回答
30

你需要避开撇号。在T-SQL中,这是带有双撇号的,因此您的insert语句变为:

Insert into Person
(First, Last)
Values
'Joe', 'O''Brien'
于 2009-12-16T03:35:32.750 回答
19

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

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

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

您想检查'''',如果它们存在于字符串中,则替换它们''''''以逃避唯一的单引号。

于 2009-12-16T04:20:18.243 回答
9

单引号通过加倍来转义

以下 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
于 2018-04-24T17:25:48.130 回答
5

eduffy 有一个好主意。他只是在他的代码示例中把它倒过来了。在 JavaScript 或 SQLite 中,您可以将撇号替换为重音符号。

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

于 2015-03-04T14:32:12.857 回答
4

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

Insert into Person
  (First, Last)
Values
  'Joe',
  concat('O',char(39),'Brien')
于 2016-07-12T11:57:57.173 回答
2

转义撇号的另一种方法是编写字符串文字:

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

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

  1. 想象一下,您有一个 Excel 列表,其中包含要上传到数据库的 1000 个名称。您可以简单地创建一个公式来使用您的单元格内容生成 1000 条 INSERT 语句,而不是手动查找撇号。

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

于 2020-08-12T11:59:51.797 回答
0

这就是我的数据作为 API 响应的样子,我想将其存储在 MYSQL 数据库中。它包含引号、HTML 代码等。

例子:-

{

rewardName: "Cabela's eGiftCard $25.00",

shortDescription: '<p>adidas gift cards can be redeemed in over 150 adidas Sport Performance, adidas Originals, or adidas Outlet stores in the US, as well as online at&nbsp;<a href="http://adidas.com/">adidas.com</a>.</p>

terms: '<p>adidas Gift Cards may be redeemed for merchandise on&nbsp;<a href="http://adidas.com/">adidas.com</a>&nbsp;and in adidas Sport Performance, adidas Originals, and adidas Outlet stores in the United States.'

}

解决方案

CREATE TABLE `brand` (
`reward_name` varchar(2048),
`short_description` varchar(2048),
`terms` varchar(2048),  
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=latin1;

插入时,在后面跟着JSON.stringify()

    let brandDetails= {
    rewardName: JSON.stringify(obj.rewardName),  
    shortDescription: JSON.stringify(obj.shortDescription),
    term: JSON.stringify(obj.term),
     }

上面是 JSON 对象,下面是向 MySQL 插入数据的 SQL 查询。

let query = `INSERT INTO brand (reward_name, short_description, terms) 
VALUES (${brandDetails.rewardName}, 
(${brandDetails.shortDescription}, ${brandDetails.terms})`;

它的工作......

在此处输入图像描述

于 2021-06-21T04:03:14.827 回答
-1

在值周围使用双引号。

insert into Person (First, Last) Values("Joe","O'Brien")
于 2017-05-30T07:07:33.373 回答
-2

改用反引号(在 ~ 键上);

`O'Brien`
于 2009-12-16T03:35:47.480 回答