web-dev-qa-db-ja.com

SQLiteクエリで使用するための単一引用符をエスケープします

データベーススキーマ(これまでは1つのテーブルのみ)と、そのテーブルのINSERTステートメントを1つのファイルに記述しました。次に、次のようにデータベースを作成しました。

$ 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

ファイルの16行目は次のようになります。

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

問題は、単一引用符のエスケープ文字です。また、単一引用符を二重にエスケープしようとしました(\\\'の代わりに\'を使用)が、それも機能しませんでした。私は何を間違えていますか?

156
jpm

一重引用符を二重にしてみてください(多くのデータベースはそのように期待しています)。

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

ドキュメント からの関連する引用:

ストリング定数は、ストリングを単一引用符( ')で囲むことにより形成されます。文字列内の単一引用符は、Pascalのように、2つの単一引用符を連続して配置することでエンコードできます。バックスラッシュ文字を使用したCスタイルのエスケープは、標準のSQLではないためサポートされません。 BLOBリテラルは、16進データを含み、単一の「x」または「X」文字が前にあるストリングリテラルです。 ...リテラル値は、トークン「NULL」にすることもできます。

262
Ryan Guill

一重引用符を2倍にして、脱出したいと思います。

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

文字列内のすべてを置換するには( ')を使用します

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

例:

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

データベースに挿入する必要があるループまたはjson文字列がある場合に備えて。文字列を一重引用符で置き換えてみてください。これが私の解決策です。一重引用符を含む文字列がある場合の例。

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

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

これは私にとってC#とJavaで機能します

3

C#では、以下を使用して一重引用符を二重引用符に置き換えることができます。

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

出力は次のようになります。

"St. Mary''s"

また、Sqliteを直接使用している場合。文字列の代わりにオブジェクトを使用して、DBNullなどの特別なものをキャッチできます。

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