バイト配列をデータベースに保存する前に、その出力を出力するnew String(data)
と「foobar」のような読み取り可能な文字列が返されますが、データベースから引き出した後は、new String(data)
「9238929384739427349327...」のようなぎこちない文字列のように読み取られます。ここには非常に多くの部分があり、それらすべてをリストアップしようと思います。eclipselinkを使用していて、データ列が定義されています。
@Lob
@Column(name = "data")
private byte[] data;
このコードを実行すると:
public static void main(String[] args) {
System.out.println(Charset.defaultCharset());
}
を出力しますwindows-1250
。
私のデータベースは次のように定義されています:
CREATE DATABASE project_trunk
WITH OWNER = project
ENCODING = 'UTF8'
TABLESPACE = pg_default
LC_COLLATE = 'English_United States.1252'
LC_CTYPE = 'English_United States.1252'
CONNECTION LIMIT = -1;
私はまた、このように定義されたDBでこれを試しました:
CREATE DATABASE project_trunk
WITH OWNER = project
ENCODING = 'UTF8'
TABLESPACE = pg_default
LC_COLLATE = 'en_US.UTF-8'
LC_CTYPE = 'en_US.UTF-8'
CONNECTION LIMIT = -1;
そして、問題はまだ発生します。
何が起こっているのかというと、私のデータベースは私のappserverとは異なるエンコーディングを持っていると思います。データベースに入れて再度引き出すと、間違った方法でデコードされるため、ぎこちないように見えます。私はそこに何かをしていますか?
今、この問題の解決策になると、私は少し混乱しています。私がすべきことは、appserverのファイルエンコーディングをデータベースと同じになるように変更することだと思います。Glassfish2.1.1を使用しています。ロケールに移動application server -> advanced -> domain attributes
して「UTF8」または「UTF-8」に設定すると、再起動が必要であると表示されます。Glassfishを再起動した後も、そのフィールドは空白のままで、エラーが発生します。多分それは財産を保存していないと思います。手動で構成ファイルに入れましたが、どこに何を入れるかわかりません。
または、ENCODING ='WIN1250'を使用してデータベースを作成しようとしましたが、作成すると、LC_CTYPEが「WIN1252」である必要があると表示されます。LC_CTYPEを「WIN1252」に設定すると、エンコーディングが存在しないと表示されます。
私はこれに多くの時間を費やしています、私はここで何かに取り組んでいるかどうか知りたいです。「appserverとdbの間の非同期エンコーディング」の私の理論は正しいように聞こえますか、それとも私は赤いニシンを追いかけていますか?誰かが私がglassfish2.1.1のこの設定を変更する方法を理解するのを手伝ってくれるなら、それも非常に役に立ちます。ありがとう
編集:人々は私が文字列を生のバイトとして保存している理由を尋ねています。それは私がしていることではありません。生のバイトが画像、PDF、またはバイナリを表す場合もあれば、テキストを表す場合もあります。私のテストでは、プレーンテキストの文字列を挿入して引き出し、正しく保存されていることを確認しています。このテストは、Linux上にあるCIサーバーで合格します。
EDIT2:生のバイナリ入力と生のバイナリ出力を表示するように求められました。
予想:[116、104、105、115、32、105、115、32、109、121、32、97、116、116、97、99、104、109、101、110、116、32、97、115 、32、97、32、83、116、114、105、110、103]
実際:[60、54、56、54、57、55、51、50、48、54、57、55、51、50、48、54、100、55、57、50、48、54、49、55 、52、55、52、54、49、54、51、54、56、54、100、54、53、54、101、55、52、50、48、54、49、55、51、50、48 、54、49、50、48、53、51、55、52、55、50、54、57、54、101、54、55]
私は、Macを使用している同僚にバイトをチェックする同じテストを行い、彼に合格しました。