¿Cómo insertar un valor que contiene un apóstrofe (comilla simple)?

310

¿Cuál es la sintaxis SQL correcta para insertar un valor con un apóstrofe?

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

Sigo recibiendo un error ya que creo que el apóstrofe después de O es la etiqueta final para el valor.

leora
fuente
16
Confirme que no se está abriendo a los ataques de inyección SQL. Use los parámetros donde sea posible.
Andrew
¿Qué lenguaje de script estás usando? Hay funciones en PHP, por ejemplo, para hacer esto correctamente por usted.
philfreo
Estoy de acuerdo con Andrew aquí: espero que esta pregunta sea solo con respecto a la ejecución de SQL a través de un cliente SQL o un "navegador de consultas" o similar, y no en algún lugar del código de producción. No usar declaraciones parametrizadas es una locura.
charstar
en realidad está en código ... si tuviera una consulta parametrizada, ¿no tendría que hacer lo mismo?
leora
2
Negativo. Dependiendo de la base de datos y el controlador que esté utilizando, el aislamiento de los parámetros puede manejarse de manera diferente, pero los parámetros en una declaración parametrizada no requieren escape. Ver en.wikipedia.org/wiki/SQL_injection#Preventing_SQL_injection
charstar

Respuestas:

485

Escape del apóstrofe (es decir, duplique el carácter de comillas simples) en su SQL:

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

Lo mismo se aplica a las consultas SELECT:

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

El apóstrofe, o comilla simple, es un carácter especial en SQL que especifica el comienzo y el final de los datos de cadena. Esto significa que para usarlo como parte de sus datos de cadena literal, necesita escapeel carácter especial. Con una sola cotización, esto se logra duplicando su cotización. (Dos caracteres de comillas simples, no comillas dobles en lugar de comillas simples).

Nota : Solo debe preocuparse por este problema cuando edite manualmente los datos a través de una interfaz SQL sin procesar, ya que escribir consultas fuera del desarrollo y las pruebas debería ser algo raro. En el código hay técnicas y marcos (dependiendo de su pila) que se encargan de escapar caracteres especiales, inyección SQL , etc.

Paul Sasik
fuente
66
$ linkQuestion = str_replace ("'", "' '", $ linkQuestion); (¡Dios, eso es difícil de leer!)
user462990
¿Qué pasa si los datos son Insertar en valores Personales (Primero, Último) 'Joe', 'Tienda del padre'?
vijesh
37

Solo tienes que duplicar las comillas simples ...

insert into Person (First, Last)
values ('Joe', 'O''Brien')
Justin Niessner
fuente
21

Necesitas escapar del apóstrofe. En T-SQL esto es con un doble apóstrofe, por lo que su insertdeclaración se convierte en:

Insert into Person
(First, Last)
Values
'Joe', 'O''Brien'
David Hall
fuente
AFAIK the Valuesdebe estar encerrado entre llaves (que luego tiene la misma respuesta que la de @JustinNiessner)
qwerty_so
15

Porque se utiliza una comilla simple para indicar el inicio y el final de una cadena; Necesitas escapar de ella.

La respuesta corta es usar dos comillas simples, ''para que una base de datos SQL almacene el valor como '.

Mire el uso de REPLACE para desinfectar los valores entrantes:

Desea verificar ''''y reemplazarlos si existen en la cadena con el ''''''fin de escapar de la única comilla simple.

Ponis OMG
fuente
3

eduffy tuvo una buena idea . Simplemente lo entendió al revés en su ejemplo de código. Ya sea en JavaScript o en SQLite, puede reemplazar el apóstrofe con el símbolo de acento.

Él (accidentalmente estoy seguro) colocó el símbolo de acento como delimitador de la cadena en lugar de reemplazar el apóstrofe en O'Brian. De hecho, esta es una solución terriblemente simple para la mayoría de los casos.

Robert Sherman
fuente
¡Una solución genial y mucho más simple y mi apellido es O`Reilly!
PhillipOReilly
De todos modos, se recomienda utilizar caracteres de escape. Accidentalmente :) desde el día que uso el teclado. Estoy usando el símbolo de acento involuntariamente en lugar de una comilla simple al escribir documentos. (Sin embargo, en el código uso 'como identificador de caracteres). Hasta el año pasado cuando alguien me dijo su contraseña y no pude iniciar sesión en su sistema. no pudimos descubrir hasta horas que estoy escribiendo 'como'.
Estudiante el
3

El carácter del apóstrofe se puede insertar llamando a la función CHAR con el valor de búsqueda de la tabla ASCII del apóstrofe , 39. Los valores de cadena se pueden concatenar junto con un operador de concatenación .

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

Las comillas simples se escapan al duplicarlas ,

El siguiente SQL ilustra esta funcionalidad.

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
fuente
0

use comillas dobles alrededor de los valores.

insert into Person (First, Last) Values("Joe","O'Brien")
Error de tiempo de ejecución
fuente
3
Tenga en cuenta que esto ya no es SQL estándar, aunque sé que Informix, por nombrar solo un DBMS, lo permite. También debe abordar cómo insertar una cadena, como el He said, "Don't!"uso de comillas simples y / o comillas dobles, que se puede hacer: 'He said, "Don''t!"'o "He said, ""Don't!""". Al agregar una nueva respuesta a una pregunta establecida con respuestas aceptadas, debe proporcionar información nueva y completa. Usar comillas dobles es nuevo, pero limitado a unos pocos DBMS; debe esforzarse por identificar al menos uno de los que sí los acepta.
Jonathan Leffler
-1

Use una tecla de retroceso (en la tecla ~) en su lugar;

`O'Brien`
eduffy
fuente
1
Entonces el problema se vuelve: ¿cómo insertar un backtick?
Jasper de Vries
1
Si bien esta no es la respuesta "correcta", estoy trabajando con un conjunto de nombres que no tienen esto, y estoy haciendo operaciones únicas, por lo que esto resolvió mi problema de inmediato. ¡Gracias!
nscalf