SQLiteクエリで使用する単一引用符をエスケープする


179

データベーススキーマ(これまでのところ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');

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

回答:


293

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

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

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

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


8
また、ホスト言語がバインドされたパラメーターをサポートしている場合は、バインドされたパラメーターの使用を検討してください(ほとんどはサポートしていますが、SQLiteシェルはサポートしていません)。SQLはその場合INSERT INTO table_name (field1, field2) VALUES (?, ?)、値は直接(および置換なしで)提供されます。
ドナルフェロー

1
二重引用符だけを使用できませんか?例:INSERT INTO table_name(field1、field2)VALUES(123、 "Hello there's"); ?
JacksOnF1re

また、文字列の寿命に応じて、最初のステップは ''を 'に変換してから再度倍にすることです。
Gary Z

44

一重引用符を2倍にして脱出する必要があると思います。

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

10

文字列のすべて( ')を置き換えるには、

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

例:

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

6

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

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

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

これはc#とjavaで私のために働きます


0

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

bashスクリプトで、値を囲む二重引用符をエスケープする必要があることがわかりました。値がnullの場合や、エスケープが必要な文字(ハイフンなど)が含まれる場合があります。

この例では、columnAの値はnullまたはハイフンを含む可能性があります。

sqlite3 $db_name "insert into foo values (\"$columnA\", $columnB)";
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.