Carácter de comillas simples de escape para usar en una consulta SQLite

179

Escribí el esquema de la base de datos (solo una tabla hasta ahora) y las instrucciones INSERT para esa tabla en un archivo. Luego creé la base de datos de la siguiente manera:

$ sqlite3 newdatabase.db
SQLite version 3.4.0
Enter ".help" for instructions
sqlite> .read ./schema.sql
SQL error near line 16: near "s": syntax error

La línea 16 de mi archivo se ve así:

INSERT INTO table_name (field1, field2) VALUES (123, 'Hello there\'s');

El problema es el carácter de escape para una comilla simple. También intenté escapar dos veces la comilla simple (usando en \\\'lugar de \'), pero eso tampoco funcionó. ¿Qué estoy haciendo mal?

jpm
fuente

Respuestas:

293

Intente duplicar las comillas simples (muchas bases de datos lo esperan así), por lo que sería:

INSERT INTO table_name (field1, field2) VALUES (123, 'Hello there''s');

Cita relevante de la documentación :

Se forma una constante de cadena encerrando la cadena entre comillas simples ('). Una comilla simple dentro de la cadena se puede codificar poniendo dos comillas simples en una fila, como en Pascal. Los escapes de estilo C que utilizan el carácter de barra diagonal inversa no son compatibles porque no son SQL estándar. Los literales BLOB son literales de cadena que contienen datos hexadecimales y están precedidos por un solo carácter "x" o "X". ... Un valor literal también puede ser el token "NULL".

Ryan Guill
fuente
8
Además, considere el uso de parámetros enlazados si el idioma del host los admite (la mayoría sí, pero el shell de SQLite no). El SQL sería entonces INSERT INTO table_name (field1, field2) VALUES (?, ?)y los valores serían suministrados directamente (y sin sustituciones).
Donal Fellows
1
¿No podemos usar comillas dobles? como: INSERT INTO table_name (field1, field2) VALUES (123, "Hola, hay"); ?
JacksOnF1re
Además, dependiendo de la vida útil de la cadena, el primer paso podría ser convertir '' a 'antes de duplicarlos nuevamente.
Gary Z
44

Creo que te gustaría escapar duplicando la cita simple:

INSERT INTO table_name (field1, field2) VALUES (123, 'Hello there''s');
flojo
fuente
10

para reemplazar todo (') en su cadena, use

.replace(/\'/g,"''")

ejemplo:

sample = "St. Mary's and St. John's";
escapedSample = sample.replace(/\'/g,"''")
M.Fahri
fuente
6

Por si acaso, si tiene un bucle o una cadena json que necesita insertar en la base de datos. Intenta reemplazar la cadena con una comilla simple. Aquí está mi solución. ejemplo si tiene una cadena que contiene una comilla simple.

String mystring = "Sample's";
String myfinalstring = mystring.replace("'","''");

 String query = "INSERT INTO "+table name+" ("+field1+") values ('"+myfinalstring+"')";

esto funciona para mí en C # y Java

Charlie D. Eupeña
fuente
0

En C # puede usar lo siguiente para reemplazar la comilla simple con una comilla doble:

 string sample = "St. Mary's";
 string escapedSample = sample.Replace("'", "''");

Y la salida será:

"St. Mary''s"

Y, si está trabajando con Sqlite directamente; puedes trabajar con objetos en lugar de cadenas y capturar cosas especiales como DBNull:

private static string MySqlEscape(Object usString)
{
    if (usString is DBNull)
    {
        return "";
    }
    string sample = Convert.ToString(usString);
    return sample.Replace("'", "''");
}
sapbucket
fuente
0

En los scripts de bash, descubrí que las comillas dobles alrededor del valor eran necesarias para los valores que podían ser nulos o que contenían caracteres que requieren un escape (como guiones).

En este ejemplo, el valor de la columna A podría ser nulo o contener guiones:

sqlite3 $db_name "insert into foo values (\"$columnA\", $columnB)";
Dan Tanner
fuente