1

単一のバックスラッシュを PostgreSQL データベースに格納する方法を知っている人はいますか?

私は C# と Nqgsql を使用して PostgreSQL にアクセスしています。私の場合は、"1\\0\\0\\0\\1\\0" をデータベースに格納したいのですが、DB フィールドに期待される文字列は " 1\0\0\0\1\0"、つまり、db フィールドに必要なバックスラッシュは 1 つだけです。したがって、db からデータを取得すると、"1\\0\\0\\0\ になります。 \1\\0" がメモリにあります。しかし、私の問題は、メモリ文字列が "1\\0\\0\\0\\1\\0" の場合、db フィールドに格納される文字列も "1\\0\\0\\0\\1 \\0" の場合、db からデータを取得すると、メモリ文字列は "1\\\\0\\\\0\\\\0\\\\1\\\\0" になります。

私が c# コードで使用した変数は、次の形式で設定されています。var b = @"1\0\0\0\1\0";

db に格納すると、両方の変数のバックスラッシュが 2 倍になっているようです。この問題に対処するには?

4

2 に答える 2

1

私もこの問題を抱えていました。データベースの構成に移動し、「standard_conforming_strings」をオフに変更することで解決できました。

于 2013-11-19T18:15:53.830 に答える
1

パラメータ化されたクエリを使用して、これを完全に回避する必要があります。Npgsqlの例を参照してください:クエリセクションでのパラメーターの使用のユーザー マニュアル。

しかし、本当にリテラル クエリを作成したい場合は、次E''のような構文を使用できます。

var sql = @"insert into table_name (column_name) values (E'1\\0\\0\\0\\1\\0')";

この構文は、サーバーまたは のような接続構成とは無関係ですstandard_conforming_strings。しかし、それはPostgres固有です。

コードを異なるデータベース エンジン間で移植できるようにする場合はset standard_conforming_strings=on、接続直後に を発行できます。次に、これは機能します:

var sql = @"insert into table_name (column_name) values ('1\0\0\0\1\0')";

このオプションは、PostgreSQL 9.1 以降でデフォルトでオンになっており、8.2 以降で使用できます。

于 2013-01-28T23:55:29.677 に答える