2012-01-10 16 views
0

現在、我々はUnicodeをサポートするためにDelphi 2007からDelphi XE2に移行しています。大きなXMLデータをブロブとしてデータベースに格納します。我々はデータベースへのUnicodeデータの保存

Param.DataType := ftBlob; 
Param.AsBlob := Value; 

以下のコードを使用します。しかし、今Unicodeのものをサポートするために、データベースフィールドにBLOB値を挿入するには、我々のデータ型はnvarchar(MAX)にデータベース内のすべてのBLOBフィールドをconveted。上記のコードを

Param.DataType := ftwideString; 
Param.AsString := Value; 

に変更しました。これは正しいことですか、データベースにUnicodeデータを格納するために別の方法で処理する必要があります。

+0

データにはどのようなエンコードを使用しますか?多くの場合、UTF-8が適しています。 –

+0

あなたはSQLサーバーを使用していますか?もしそうなら、あなたは 'ftMemo'(私は' nvarchar(MAX) 'と同じだと思います)として解決するXMLデータ型(' XQuery'サポートを提供する)を使うことができます。 – kobik

+0

この質問の答えは、使用しているデータアクセスコンポーネントによって異なります。 ADO? SQL Serverのバージョン? SQL Antive Clientが使用されていますか? –

答えて

3

BLOBsは、あなたが何かを推測することなく、あなたが投げたものを保存します。彼らはほとんど操作能力を持っていないかもしれませんが、彼らは決してデータを変更しません。一方、文字ベースのフィールド(CLOBさえも)には、関連する文字セットがあります。これにより、そこに格納されたデータは、ソース・キャラクタ・セットおよび宛先キャラクタ・セットから前後に変換される。たとえば、XMLファイルがUTF-8でエンコードされていて、フィールドがUTF-16の場合は、書き込みおよび読み取り時に変換されます。もちろん、両方のエンコーディングが同じ場合、変換は実行されません。データベースにXML型がない場合は、異なるエンコーディングになる可能性があり、操作(書き込み/読み取り)が必要ない場合は、バイナリロブに格納します。それらが常に同じエンコーディングにあれば、文字ロブは扱いやすくなります。大きなXMLファイルで文字フィールドを使用すると、最大フィールドサイズのためにエラーが発生することがあります。

1

あなたのソリューションが動作するはずですが、私はBLOBフィールドのフォーマットを維持することをお勧めは、データベース(Firebirdの一例)のデフォルトエンコーディングとしてUTF-8を使用します。

CREATE DATABASE 'localhost:c:\Data\MyDatabase.FDB' user 'SYSDBA' password 'masterkey' 
    DEFAULT CHARACTER SET UTF8; 

とあなたのXML文字列がUTF8エンコーディングに変換、それを保存する前にブロブとして。

+1

UTF- – OnTheFly

関連する問題