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.

leora
fonte
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.

Paul Sasik
fonte
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')
Justin Niessner
fonte
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'
David Hall
fonte
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.

Pôneis OMG
fonte
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.

Robert Sherman
fonte
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')
Nathan
fonte
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
Max Pringle
fonte
0

use aspas duplas em torno dos valores.

insert into Person (First, Last) Values("Joe","O'Brien")
run_time_error
fonte
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`
eduffy
fonte
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