Escolher caractere de aspas simples para uso em uma consulta SQLite


179

Eu escrevi o esquema do banco de dados (apenas uma tabela até agora) e as instruções INSERT para essa tabela em um arquivo. Então eu criei o banco de dados da seguinte maneira:

$ 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

A linha 16 do meu arquivo é mais ou menos assim:

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

O problema é o caractere de escape para uma única citação. Também tentei escapar duas vezes da citação simples (usando em \\\'vez de \'), mas isso também não funcionou. O que estou fazendo de errado?

Respostas:


293

Tente dobrar as aspas simples (muitos bancos de dados esperam dessa maneira), portanto seria:

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

Citações relevantes da documentação :

Uma constante de cadeia é formada colocando-a entre aspas simples ('). Uma aspas simples dentro da string pode ser codificada colocando duas aspas simples em uma linha - como no Pascal. Escapadas no estilo C usando o caractere de barra invertida não são suportadas porque não são SQL padrão. Literais BLOB são literais de string contendo dados hexadecimais e precedidos por um único caractere "x" ou "X". ... Um valor literal também pode ser o token "NULL".


8
Além disso, considere usar parâmetros vinculados se a linguagem do host os suportar (a maioria sim, mas o shell SQLite não). O SQL seria então INSERT INTO table_name (field1, field2) VALUES (?, ?)e os valores seriam fornecidos diretamente (e sem substituições).
Donal Fellows

1
Não podemos simplesmente usar aspas duplas? como: INSERT INTO nome_tabela (campo1, campo2) VALUES (123, "Olá, lá"); ?
precisa saber é o seguinte

Além disso, dependendo do tempo de vida da string, o primeiro passo pode ser converter '' para '' antes de dobrá-los novamente.
Gary Z

44

Eu acredito que você gostaria de escapar dobrando a citação única:

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

10

para substituir todos (') na sua string, use

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

exemplo:

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

6

Apenas no caso de você ter um loop ou uma string json que precisa inserir no banco de dados. Tente substituir a string por uma única citação. aqui está a minha solução. exemplo, se você tiver uma sequência que contenha uma aspas simples.

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

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

isso funciona para mim em c # e java


0

Em C #, você pode usar o seguinte para substituir as aspas simples por aspas duplas:

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

E a saída será:

"St. Mary''s"

E, se você estiver trabalhando diretamente com o Sqlite; você pode trabalhar com objetos em vez de string e capturar coisas especiais como DBNull:

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

0

Nos scripts bash, descobri que era necessário escapar aspas duplas ao redor do valor para valores que poderiam ser nulos ou continham caracteres que requerem escape (como hífens).

Neste exemplo, o valor da colunaA pode ser nulo ou conter hífens .:

sqlite3 $db_name "insert into foo values (\"$columnA\", $columnB)";
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.