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');
問題は、一重引用符のエスケープ文字です。また、( \ '
の代わりに \\\'
を使用して)一重引用符を二重にエスケープしようとしましたが、それも機能しませんでした。私は何を間違えていますか?
解決
一重引用符を二重にしてみてください(多くのデータベースはそのように期待しています)。
INSERT INTO table_name (field1, field2) VALUES (123, 'Hello there''s');
ドキュメントからの関連引用:
文字列定数は、文字列を単一引用符( ')で囲むことにより形成されます。文字列内の単一引用符は、Pascalのように、2つの単一引用符を連続して配置することでエンコードできます。バックスラッシュ文字を使用したCスタイルのエスケープは、標準のSQLではないためサポートされません。 BLOBリテラルは、16進データを含み、単一の" x"が前にあるストリングリテラルです。または" X"キャラクター。 ...リテラル値は、トークン" NULL"にすることもできます。
他のヒント
一重引用符を2重にしてエスケープしたいと思います:
INSERT INTO table_name (field1, field2) VALUES (123, 'Hello there''s');
文字列のすべてを置換( ')するには、
を使用します.replace(/\'/g,"''")
例:
sample = "St. Mary's and St. John's";
escapedSample = sample.replace(/\'/g,"''")
データベースに挿入する必要があるループまたはjson文字列がある場合に備えて。文字列を一重引用符に置き換えてみてください。これが私の解決策です。一重引用符を含む文字列がある場合の例。
String mystring = "Sample's";
String myfinalstring = mystring.replace("'","''");
String query = "INSERT INTO "+table name+" ("+field1+") values ('"+myfinalstring+"')";
これはc#とjavaで機能します
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("'", "''");
}