アプリ版:「スタンプのみでお礼する」機能のリリースについて

SQLServer からのデータ移行(varbinary)

SQLServer 2000 から PostgreSQL 8.4.3 へデータ移行を考えているのですが、
つまずいて困っています。
ご存知の方がいらっしゃいましたら教えていただけないでしょうか。


あるテーブル上にvarbinary(32)の項目があり、
クエリアナライザで見ると「0x11223344・・・」という値が入っているのですが、
PostgreSQL側ではこの項目のデータ型はどう定義したらよいでしょうか。
character varying(32)としてみましたが、
定義がふさわしくないのか、SQLがまずいのか、思うようにINSERTができませんでした。

たとえば、
insert into ... values(0x1122334455667788990011223344556677889900112233445566778899001122, ...)
とすると

---
NOTICE: 識別子"x1122334455667788990011223344556677889900112233445566778899001122"を"x11223344556677889900112233445566778899001122334455667788990011"に切り詰めます
SQLステート:42601
---

が返りますし
insert into ... values(x'1122334455667788990011223344556677889900112233445566778899001122', ...)
では

---
ERROR: 値は型character varying(32)としては長すぎます
SQLステート:22001
---

が返ります。

実際は、.Net C# のプログラムにてDataTableにSQLServerからデータをFillして、それを元にINSERT文を作成しています。
デバッグすると、Byte配列に[0]17,[1]34... という具合に入ってくるので

if ((col.DataType == typeof(String)) || (col.DataType == typeof(DateTime)) ||(col.DataType == typeof(Decimal)) )
{
valueColumns.AppendFormat("'{0}',", row[col.ColumnName].ToString());
}
else if(col.DataType == typeof(Byte[]))
{
string tmp = "";
for (int i = 0; i < ((Byte[])row[col.ColumnName]).Length; i++)
{
tmp += (string.Format("{0:X2}", ((Byte[])row[col.ColumnName])[i]));
}
valueColumns.AppendFormat("x'{0}',", tmp);
}
else
{
valueColumns.AppendFormat("{0},", row[col.ColumnName].ToString());
}


のようにDataType別に振り分けて、上記else ifが通るようにコーディングしています。
よろしくお願いいたします。

A 回答 (1件)

こんにちは。



0x11223344・・・・を数値として保存しようとしたら切り詰められるかと。

文字列として保存する場合はドキュメントに
-----------------------------------------
短い文字列(126バイトまで)の保存には、実際の文字列に1バイト加えたサイズが必要です。
characterでは空白によるパッド分が加わります。
-----------------------------------------
とあります。

Postgres側のデータ型が varcharでいいのかってことですが、ロケールによっては
NGの場合があるかもしれないので私でしたら素直に?bytea型にします。

bytea型で文字列リテラルとして入力する方法はドキュメントをご覧ください
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!