Escapar caractere de aspas simples para uso em uma consulta de SQLite
Pergunta
Eu escrevi o esquema de banco de dados (apenas uma mesa até agora), e as instruções INSERT para essa tabela em um arquivo. Então eu criei o banco de dados da seguinte forma:
$ 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
Linha 16 do meu arquivo é algo como isto:
INSERT INTO table_name (field1, field2) VALUES (123, 'Hello there\'s');
O problema é o caractere de escape para uma única cotação. Eu também tentei dupla escapar o apóstrofo (usando \\\'
vez de \'
), mas isso não quer trabalhar. O que estou fazendo de errado?
Solução
Tente dobrar as aspas simples (muitos bancos de dados espera-se que maneira), então seria:
INSERT INTO table_name (field1, field2) VALUES (123, 'Hello there''s');
citação relevante de a documentação :
A constante de cadeia é formada colocando a string entre aspas simples ( '). A única citação dentro da corda pode ser codificado, colocando duas aspas simples em uma linha - como em Pascal. escapes de estilo C usando a barra invertida não são suportados porque eles não são SQL padrão. literais BLOB são strings literais contendo dados hexadecimais e precedido por um único caractere "x" ou "X". ... Um valor literal também pode ser o "NULL" token.
Outras dicas
Eu acredito que você iria querer escapar dobrando o aspas simples:
INSERT INTO table_name (field1, field2) VALUES (123, 'Hello there''s');
para substituir todos ( ') na cadeia, uso
.replace(/\'/g,"''")
exemplo:
sample = "St. Mary's and St. John's";
escapedSample = sample.replace(/\'/g,"''")
Apenas no caso, se você tem um loop ou uma string JSON que necessidade de inserir no banco de dados. Tente substituir a cadeia com uma única citação. aqui está a minha solução. exemplo, se você tem uma cadeia que contêm uma única citação.
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
Em C # você pode usar o seguinte para substituir o apóstrofo com aspas duplas:
string sample = "St. Mary's";
string escapedSample = sample.Replace("'", "''");
E a saída será:
"St. Mary''s"
E, se você estiver trabalhando com Sqlite diretamente; você pode trabalhar com objeto em vez de corda e pegar coisas especiais como DBNull:
private static string MySqlEscape(Object usString)
{
if (usString is DBNull)
{
return "";
}
string sample = Convert.ToString(usString);
return sample.Replace("'", "''");
}