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


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

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

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

Author: Peter Mortensen, 2009-12-16

9 answers

Escape el apóstrofo (es decir, doble el carácter de comilla simple) 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óstrofo, o comilla simple, es un carácter especial en SQL que especifica el principio y el final de los datos de cadena. Esto significa que para usarlo como parte de sus datos de cadena literal necesita escape el carácter especial. Con una sola cotización, esto se logra típicamente duplicando su cotización. (Dos comillas simples, no comillas dobles en lugar de comillas simples.)

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

 359
Author: Paul Sasik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-25 16:31:17

Solo tienes que doblar las comillas simples...

insert into Person (First, Last)
values ('Joe', 'O''Brien')
 28
Author: Justin Niessner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-12-16 03:36:55

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

Insert into Person
(First, Last)
Values
'Joe', 'O''Brien'
 16
Author: David Hall,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-25 16:31:57

Debido a que se usa una comilla simple para indicar el inicio y el final de una cadena; necesita escaparla.

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

Mira el uso de REEMPLAZAR para desinfectar los valores entrantes:

Desea comprobar para '''', y reemplácelos si existen en la cadena con '''''' para escapar de la comilla simple solitaria.

 12
Author: OMG Ponies,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-25 16:32:56

Eduffy tuvo una buena idea . Él sólo lo consiguió al revés en su ejemplo de código. Ya sea en JavaScript o en SQLite puede reemplazar el apóstrofo con el símbolo de acento.

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

 1
Author: Robert Sherman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:47:28

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

Insert into Person
  (First, Last)
Values
  'Joe',
  concat('O',char(39),'Brien')
 1
Author: Nathan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-12 11:57:57

Use comillas dobles alrededor de los valores.

insert into Person (First, Last) Values("Joe","O'Brien")
 1
Author: run_time_error,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-30 07:07:33

Las comillas simples se escapan duplicándolas ,

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
 0
Author: Max Pringle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-24 17:25:48

Usa un backtick (en la tecla~) en su lugar;

`O'Brien`
 -2
Author: eduffy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-12-16 03:35:47