Como inserir um valor que contém um apóstrofo (aspas simples)?


310

Qual é a sintaxe correta do SQL para inserir um valor com um apóstrofo?

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

Eu continuo recebendo um erro, pois acho que o apóstrofo após o O é a tag final do valor.


16
Confirme que você não está se abrindo para ataques de injeção SQL. Use parâmetros sempre que possível.
— 18713 Andrew Andrew

Qual linguagem de script você está usando? Existem funções no PHP, por exemplo, para fazer isso corretamente para você.
— 31410 philfreo

Concordando com Andrew aqui: Espero que esta pergunta seja apenas em relação à execução do SQL por meio de um cliente SQL ou "navegador de consulta" ou algo assim, e não realmente em algum lugar do código de produção. Não usar instruções parametrizadas é loucura.
— 22123 charstar

na verdade, está no código .. se eu tivesse uma consulta parametrizada, não precisaria fazer a mesma coisa?
— Leora

2
Negativo. Dependendo do banco de dados e do driver que você está usando, o isolamento dos parâmetros pode ser tratado de maneira diferente, mas os parâmetros em uma instrução parametrizada não requerem escape. Veja en.wikipedia.org/wiki/SQL_injection#Preventing_SQL_injection
— charstar

Respostas:


485

Escape do apóstrofo (ou seja, dobre o caractere de aspas simples) em seu SQL:

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

O mesmo se aplica às consultas SELECT:

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

O apóstrofo, ou aspas simples, é um caractere especial no SQL que especifica o início e o fim dos dados da string. Isso significa que, para usá-lo como parte de seus dados literais, você precisa escapedo caractere especial. Com uma única citação, isso geralmente é realizado duplicando sua citação. (Dois caracteres de aspas simples, não aspas duplas em vez de aspas simples.)

Nota : Você só deve se preocupar com esse problema ao editar manualmente os dados por meio de uma interface SQL bruta, pois a gravação de consultas fora do desenvolvimento e teste deve ser uma ocorrência rara. No código, existem técnicas e estruturas (dependendo da sua pilha) que cuidam da fuga de caracteres especiais, injeção SQL , etc.


6
$ linkQuestion = str_replace ("'", "' '", $ linkQuestion); (caramba, isso é difícil de ler!)
— user462990

e se os dados forem Inserir nos valores da pessoa (primeiro, último) 'Joe', 'Loja do pai'.
— vijesh 18/03

37

Você só precisa dobrar as aspas simples ...

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

21

Você precisa escapar do apóstrofo. No T-SQL, isso ocorre com um duplo apóstrofo, portanto sua insertdeclaração se torna:

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

AFAIK o Valuesdeve ficar entre chaves (que, em seguida, faz com que seja a mesma resposta que a de @JustinNiessner)
— qwerty_so

15

Como uma aspas simples é usada para indicar o início e o fim de uma string; você precisa escapar disso.

A resposta curta é usar duas aspas simples - ''- para que um banco de dados SQL armazene o valor como '.

Observe o uso de REPLACE para higienizar os valores recebidos:

Você deseja verificar ''''e substituí-los, se existirem na sequência com '''''', para escapar da aspas simples.


3

Eduffy teve uma boa ideia . Ele acabou de retroceder em seu exemplo de código. No JavaScript ou no SQLite, você pode substituir o apóstrofo pelo símbolo de acentuação.

Ele (acidentalmente, tenho certeza) colocou o símbolo de acentuação como o delimitador da corda, em vez de substituir o apóstrofo em O'Brian. Esta é de fato uma solução incrivelmente simples para a maioria dos casos.


Solução excelente e muito mais simples e meu sobrenome é O`Reilly!
— PhillipOReilly

De qualquer forma, é recomendável usar caracteres de escape. Acidentalmente :) desde o dia em que estou usando o teclado. Estou usando o símbolo de acentuação acidentalmente no lugar de aspas simples ao escrever documentos. (no entanto, no código eu uso 'como identificador de caracteres). Até o ano passado, quando alguém me disse sua senha e eu não consegui entrar no sistema dele. não conseguimos descobrir até horas que estou digitando 'como `.
— Learner

3

O caractere do apóstrofo pode ser inserido chamando a função CHAR com o valor de pesquisa da tabela ASCII do apóstrofo , 39. Os valores da sequência podem ser concatenados juntamente com um operador concatenado .

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

2

As aspas simples são escapadas dobrando-as ,

O SQL a seguir ilustra essa funcionalidade.

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

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

select * from @person

Resultados

First   | Last
===================
Joe     | O'Brien

0

use aspas duplas em torno dos valores.

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

3
Observe que esse não é mais o SQL padrão, embora eu saiba que o Informix, para citar apenas um DBMS, permite isso. Você também deve abordar como inserir uma sequência, como o He said, "Don't!"uso de aspas simples e / ou aspas duplas - o que pode ser feito: 'He said, "Don''t!"'ou "He said, ""Don't!""". Ao adicionar uma nova resposta a uma pergunta estabelecida há muito tempo com respostas aceitas, você deve fornecer informações novas e completas. O uso de aspas duplas é novo - mas limitado a alguns DBMS; você deve se esforçar para identificar pelo menos um daqueles que os aceita.
— Jonathan Leffler

-1

Use um bastão (na tecla ~);

`O'Brien`

1
Então o problema se torna: como inserir um backtick?
— Jasper de Vries

1
Embora essa não seja a resposta "correta", estou trabalhando com um conjunto de nomes que não possuem essa opção e realizando operações pontuais, por isso resolvi imediatamente o meu problema. Obrigado!
— nscalf 16/03
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.