次の方法で共有


XML データ型の使用

SQL Server 2005 には xml データ型が導入されています。このデータ型を使用すると XML ドキュメントや XML フラグメントを SQL Server データベースに格納できます。xml データ型は SQL Server での組み込みデータ型の 1 つであり、intvarchar などの他の組み込みデータ型といくつかの点で似ている部分があります。xml データ型は、他の組み込みデータ型と同様に、テーブル作成時の列の型、変数の型、パラメータの型、または関数の戻り値の型として使用したり、CAST 関数や CONVERT 関数でも使用できます。

プログラミングの考慮事項

XML は自己記述型で、必要に応じて、次のようにドキュメントのエンコードを指定する XML ヘッダーを含めることができます。

<?xml version="1.0" encoding="windows-1252"?><doc/>

XML 標準では、ドキュメントの先頭の数バイトを調べることで、ドキュメントで使用しているエンコードを XML プロセッサで検出する方法が説明されています。アプリケーションで指定するエンコードとドキュメントで指定されているエンコードが競合する場合があります。バインドされたパラメータとして渡されるドキュメントの場合、SQL Server では XML がバイナリ データとして扱われるので、データ変換は行われず、XML パーサーはドキュメントに指定されたエンコードを問題なく使用することができます。ただし、WSTR としてバインドされた XML データの場合、そのドキュメントが Unicode でエンコードされていることをアプリケーションで確認する必要があります。この場合、必然的にドキュメントが DOM に読み込まれることになり、エンコードが Unicode に変更され、ドキュメントはシリアル化されます。この処理が行われないと、データ変換が行われ、結果として無効なまたは破損した XML になります。

また、XML がリテラルで指定された場合も競合が発生する可能性があります。たとえば、次に示すステートメントは無効です。

INSERT INTO xmltable(xmlcol) VALUES('<?xml version="1.0" encoding="UTF-16"?><doc/>')

INSERT INTO xmltable(xmlcol) VALUES(N'<?xml version="1.0" encoding="UTF-8"?><doc/>')

SQL Server Native Client OLE DB プロバイダ

DBTYPE_XML は、SQL Server Native Client OLE DB プロバイダの新しい XML 固有のデータ型です。また、既存の OLE DB 型である DBTYPE_BYTES、DBTYPE_WSTR、DBTYPE_BSTR、DBTYPE_XML、DBTYPE_STR、DBTYPE_VARIANT、および DBTYPE_IUNKNOWN を使用して、XML データにアクセスできます。XML 型の列に格納されたデータ型は、SQL Server Native Client OLE DB プロバイダの行セット内の列から、次の形式で取得できます。

  • テキスト文字列

  • ISequentialStream

注意

SQL Server Native Client OLE DB プロバイダには SAX リーダーは含まれていませんが、MSXML を使用して ISequentialStream を簡単に SAX オブジェクトや DOM オブジェクトに渡せます。

ISequentialStream は、大きな XML ドキュメントを取得するために使用します。他の大きな値の型で使用される方法と同じ方法を XML でも使用できます。詳細については、「大きな値をとるデータ型の使用」を参照してください。

行セットの XML 型の列に格納されているデータは、アプリケーションで IRow::GetColumnsIRowChange::SetColumnsICommand::Execute などの通常のインターフェイスを使用することにより、取得、挿入、または更新できます。取得する場合と同様に、テキスト文字列または ISequentialStream を SQL Server Native Client OLE DB プロバイダに渡せます。

注意

ISequentialStream インターフェイスを使用して XML データを文字列形式で送信するには、DBTYPE_IUNKNOWN を指定して ISequentialStream を取得し、その pObject 引数をバインドの際に NULL に設定する必要があります。

コンシューマのバッファが小さすぎて取得した XML データが切り捨てられるときは、データ長が 0xffffffff で返されます。この値は、長さが不明であることを意味します。この動作は、実際のデータの前に長さの情報を送信しないでクライアントにストリーム送信されるデータ型の実装と一貫性を持たせています。IRowset::GetData のようにプロバイダが値全体をバッファに読み込み、データ変換を行うときは、実際の長さを返すことができます。

SQL Server に送信される XML データは、サーバーではバイナリ データとして扱われます。その結果、変換が行われず、XML パーサーが XML エンコードを自動検出できます。これにより、広範な XML ドキュメント (UTF-8 でエンコードされた XML ドキュメントなど) を SQL Server への入力として受け取ることができます。

入力 XML が DBTYPE_WSTR にバインドされる場合、不要なデータ変換によってデータが破損しないようにするために、アプリケーションでは入力 XML が Unicode でエンコードされていることを確認する必要があります。

データ バインドと強制型変換

次の表に、特定のデータ型を SQL Server の xml データ型と共に使用した場合に行われるバインドおよび強制型変換を示します。

データ型

SQL Server の

XML データ型へ

SQL Server の

XML 以外のデータ型へ

SQL Server の

XML データ型から

SQL Server の

XML 以外のデータ型から

DBTYPE_XML

パス スルー6,7

エラー1

可11、6

エラー8

DBTYPE_BYTES

パス スルー6,7

N/A2

可11、6

N/A2

DBTYPE_WSTR

パス スルー6,10

N/A2

可4、6、12

N/A2

DBTYPE_BSTR

パス スルー6,10

N/A2

可3

N/A2

DBTYPE_STR

可6、9、10

N/A2

可5、6、12

N/A2

DBTYPE_IUNKNOWN

ISequentialStream 経由のバイト ストリーム7

N/A2

ISequentialStream 経由のバイト ストリーム11

N/A2

DBTYPE_VARIANT (VT_UI1 | VT_ARRAY)

パス スルー6,7

N/A2

N/A

N/A2

DBTYPE_VARIANT (VT_BSTR)

パス スルー6,10

N/A2

可3

N/A2

1DBTYPE_XML 以外のサーバー型が ICommandWithParameters::SetParameterInfo で指定され、アクセサ型が DBTYPE_XML の場合、ステートメントの実行時にエラーが発生します (DB_E_ERRORSOCCURRED、パラメータの状態は DBSTATUS_E_BADACCESSOR)。それ以外の場合は、データがサーバーに送信されますが、XML 型からパラメータのデータ型への暗黙の変換が行われないことを示すエラーがサーバーから返されます。

2このトピックでの説明の対象外です。

3形式は UTF-16 です。バイト順マーク (BOM)、エンコード仕様、および終端を示す NULL は付加されません。

4形式は UTF-16 です。BOM とエンコード仕様は付加されず、NULL で終端が示されます。

5クライアントのコード ページでエンコードされ、NULL で終端が示される、マルチバイト文字列形式です。Unicode を使用できるサーバーから変換するとデータが破損する場合があるので、このバインドはお勧めしません。

6BY_REF を使用できます。

7UTF-16 データは BOM で始まる必要があります。BOM で始まらない場合は、サーバーでエンコードが正しく認識されないことがあります。

8検証は、アクセサの作成時、またはフェッチ時に行われます。エラーは DB_E_ERRORSOCCURRED です。その場合、バインドの状態は DBBINDSTATUS_UNSUPPORTEDCONVERSION に設定されます。

9データは、サーバーに送信される前にクライアントのコード ページを使用して Unicode に変換されます。ドキュメントのエンコードがクライアントのコード ページと一致しない場合、変換によってデータが破損することがあるので、このバインドはお勧めしません。

10サーバーに送信されるデータには必ず BOM が追加されます。既にデータが BOM で始まる場合、この動作により、バッファの先頭に 2 つの BOM が存在することになります。サーバーでは、1 つ目の BOM からエンコードを UTF-16 と認識した後、その BOM を破棄します。2 つ目の BOM は、幅が 0 の改行を行わない空白文字として解釈されます。

11形式は UTF-16 です。エンコード仕様は付加されません。サーバーから受け取ったデータに BOM が追加されます。サーバーから空文字列が返されても、アプリケーションには BOM が返されます。バッファ長が奇数バイトの場合、データは適切に切り捨てられます。1 つの値が複数のチャンクで返される場合、それぞれを連結して正しい値を再構成できます。

12バッファ長が 2 文字未満の場合、つまり領域が不足して NULL で終端が示されない場合、オーバーフロー エラーが報告されます。

注意

NULL の XML 値の場合は、データは返されません。

XML 標準では、UTF-16 でエンコードされた XML をバイト順マーク (BOM) で始める必要があります。BOM は UTF-16 の文字コードでは 0xFEFF です。WSTR バインドおよび BSTR バインドを使用する場合、そのバインドによってエンコードが暗黙的に決まるので、SQL Server Native Client から BOM が要求されることも追加されることもありません。BYTES バインド、XML バインド、または IUNKNOWN バインドを使用する場合、その目的は他の XML プロセッサや XML ストレージ システムでの処理を簡単にすることです。この場合、BOM は UTF-16 でエンコードされた XML を示し、SQL Server を含め XML プロセッサの多くは値の先頭の数バイトを調べてエンコードを推定するので、アプリケーションで実際のエンコードを考慮する必要はありません。BYTES バインド、XML バインド、または IUNKNOWN バインドを使用して SQL Server Native Client から受け取る XML データは、常に、BOM が付加された UTF-16 にエンコードされ、エンコード宣言は埋め込まれません。

OLE DB Core Services で提供されるデータ変換 (IDataConvert) は、DBTYPE_XML 型には適用できません。

検証はデータがサーバーに送信されたときに行われます。クライアント側の検証とエンコードの変更はアプリケーションで処理する必要がありますが、直接処理するのではなく、DOM リーダーや SAX リーダーを使用して XML データを処理することを強くお勧めします。

DBTYPE_NULL と DBTYPE_EMPTY は入力パラメータにバインドできますが、出力パラメータや結果にはバインドできません。入力パラメータにバインドした場合、状態を DBSTATUS_S_ISNULL または DBSTATUS_S_DEFAULT に設定する必要があります。

DBTYPE_XML は DBTYPE_EMPTY および DBTYPE_NULL に変換でき、DBTYPE_EMPTY は DBTYPE_XML に変換できますが、DBTYPE_NULL を DBTYPE_XML に変換することはできません。この動作は、DBTYPE_WSTR と一貫性があります。

DBTYPE_IUNKNOWN は上記の表に示したようにサポート済みのバインドですが、DBTYPE_XML と DBTYPE_IUNKNOWN との間では変換は行われません。DBTYPE_IUNKNOWN は、DBTYPE_BYREF と共に使用することはできません。

OLE DB 行セットに関する追加事項と変更事項

SQL Server Native Client では、多くの主要な OLE DB スキーマ行セットに新しい値が追加され、変更が加えられました。

COLUMNS スキーマ行セットと PARAMETERS スキーマ行セット

COLUMNS スキーマ行セットと PROCEDURE_PARAMETERS スキーマ行セットに次の列が追加されました。

列名

データ型

説明

SS_XML_SCHEMACOLLECTION_CATALOGNAME

DBTYPE_WSTR

XML スキーマ コレクションを定義しているカタログの名前。XML 型以外の列または型指定されていない XML 列の場合は NULL です。

SS_XML_SCHEMACOLLECTION_SCHEMANAME

DBTYPE_WSTR

XML スキーマ コレクションを定義しているスキーマの名前。XML 型以外の列または型指定されていない XML 列の場合は NULL です。

SS_XML_SCHEMACOLLECTIONNAME

DBTYPE_WSTR

XML スキーマ コレクションの名前。XML 型以外の列または型指定されていない XML 列の場合は NULL です。

PROVIDER_TYPES スキーマ行セット

PROVIDER_TYPES スキーマ行では、xml データ型の COLUMN_SIZE の値は 0 で、DATA_TYPE は DBTYPE_XML です。

SS_XMLSCHEMA スキーマ行セット

クライアントで XML スキーマ情報を取得できるように、新しいスキーマ行セット SS_XMLSCHEMA が導入されました。SS_XMLSCHEMA 行セットには、次の列が含まれています。

列名

データ型

説明

SCHEMACOLLECTION_CATALOGNAME

DBTYPE_WSTR

XML コレクションが属するカタログ。

SCHEMACOLLECTION_SCHEMANAME

DBTYPE_WSTR

XML コレクションが属するスキーマ。

SCHEMACOLLECTIONNAME

DBTYPE_WSTR

型指定された XML 列の場合は、XML スキーマ コレクションの名前です。それ以外の場合は、NULL です。

TARGETNAMESPACEURI

DBTYPE_WSTR

XML スキーマの対象名前空間。

SCHEMACONTENT

DBTYPE_WSTR

XML スキーマのコンテンツ。

各 XML スキーマのスコープは、カタログ名、スキーマ名、スキーマ コレクション名、および対象名前空間を識別する Uniform Resource Identifier (URI) 別に設定されます。また、DBSCHEMA_XML_COLLECTIONS という名前の新しい GUID も定義されます。SS_XMLSCHEMA スキーマ行セットの制限数と制限列は、次のように定義されます。

GUID

制限数

制限列

DBSCHEMA_XML_COLLECTIONS

4

SCHEMACOLLECTION_CATALOGNAME

SCHEMACOLLECTION_SCHEMANAME

SCHEMACOLLECTIONNAME

TARGETNAMESPACEURI

OLE DB プロパティ セットに関する追加事項と変更事項

SQL Server Native Client では、多くの主要な OLE DB のプロパティ セットに新しい値が追加され、変更が加えられました。

DBPROPSET_SQLSERVERPARAMETER プロパティ セット

OLE DB で xml データ型をサポートするため、SQL Server Native Client では、次の値を含む新しい DBPROPSET_SQLSERVERPARAMETER プロパティ セットが実装されました。

名前

データ型

説明

SSPROP_PARAM_XML_SCHEMACOLLECTION_CATALOGNAME

DBTYPE_WSTR

XML スキーマ コレクションを定義しているカタログ (データベース) の名前。SQL の 3 部構成による名前の識別子の一部になります。

SSPROP_PARAM_XML_SCHEMACOLLECTION_SCHEMANAME

DBTYPE_WSTR

スキーマ コレクションに含まれている XML スキーマの名前。SQL の 3 部構成による名前の識別子の一部になります。

SSPROP_PARAM_XML_SCHEMACOLLECTIONNAME

DBTYPE_WSTR

カタログに含まれている XML スキーマ コレクションの名前。SQL の 3 部構成による名前の識別子の一部になります。

DBPROPSET_SQLSERVERCOLUMN プロパティ セット

ITableDefinition インターフェイスでのテーブルの作成をサポートするため、SQL Server Native Client では、DBPROPSET_SQLSERVERCOLUMN プロパティ セットに次の 3 つの新しい列が追加されました。

名前

データ型

説明

SSPROP_COL_XML_SCHEMACOLLECTION_CATALOGNAME

VT_BSTR

型指定された XML 列の場合、このプロパティは XML スキーマが格納されているカタログ名を指定する文字列です。他のデータ型の列の場合、このプロパティでは空文字列が返されます。

SSPROP_COL_XML_SCHEMACOLLECTION_SCHEMANAME

VT_BSTR

型指定された XML 列の場合、このプロパティはこの列を定義している XML スキーマ名を指定する文字列です。

SSPROP_COL_XML_SCHEMACOLLECTIONNAME

VT_BSTR

型指定された XML 列の場合、このプロパティは値を定義している XML スキーマ コレクション名を指定する文字列です。

SSPROP_PARAM 値と同様に、これらのプロパティはすべて省略可能なプロパティで、既定値は空です。SSPROP_COL_XML_SCHEMACOLLECTION_CATALOGNAME と SSPROP_COL_XML_SCHEMACOLLECTION_SCHEMANAME は、SSPROP_COL_XML_SCHEMACOLLECTIONNAME が指定されている場合のみ指定できます。XML をサーバーに渡すときにこれらの値が含まれていると、これらの値が妥当かどうかが現在のデータベースとの比較によりチェックされ、インスタンス データがスキーマとの比較によりチェックされます。どの場合でも、これらはすべて空かすべて設定されている場合に妥当と判断されます。

OLE DB インターフェイスに関する追加事項と変更事項

SQL Server Native Client では、多くの主要な OLE DB インターフェイスに新しい値が追加され、変更が加えられました。

ISSCommandWithParameters インターフェイス

OLE DB で xml データ型をサポートするため、SQL Server Native Client では、ISSCommandWithParameters インターフェイスの追加など、多数の変更が加えられました。この新しいインターフェイスは、主要な OLE DB インターフェイス ICommandWithParameters から継承されます。ICommandWithParameters インターフェイスから継承される 3 つのメソッド (GetParameterInfoMapParameterNames、および SetParameterInfo) に加えて、ISSCommandWithParameters インターフェイスでは、サーバー固有のデータ型を処理する GetParameterProperties メソッドと SetParameterProperties メソッドが提供されます。

注意

また、ISSCommandWithParameters インターフェイスでは、新しい SSPARAMPROPS 構造体も使用されます。

IColumnsRowset インターフェイス

SQL Server Native Client では、次の SQL Server 固有の列が IColumnRowset::GetColumnsRowset メソッドで返される行セットに追加されました。これらの列には、XML スキーマ コレクションの 3 部構成の名前が含まれます。XML 以外の列または型指定されていない XML 列の場合、これら 3 列の既定値はすべて NULL になります。

列名

データ型

説明

DBCOLUMN_SS_XML_SCHEMACOLLECTION_CATALOGNAME

DBTYPE_WSTR

XML スキーマ コレクションが属するカタログ。

それ以外の場合は、NULL です。

DBCOLUMN_SS_XML_SCHEMACOLLECTION_SCHEMANAME

DBTYPE_WSTR

XML スキーマ コレクションが属するスキーマ。それ以外の場合は、NULL です。

DBCOLUMN_SS_XML_SCHEMACOLLECTIONNAME

DBTYPE_WSTR

型指定された XML 列の場合は、XML スキーマ コレクションの名前です。それ以外の場合は、NULL です。

IRowset インターフェイス

XML 列内の XML インスタンスは IRowset::GetData メソッドを使用して取得されます。クライアントで指定されているバインドによって異なりますが、XML インスタンスは DBTYPE_BSTR、DBTYPE_WSTR、DBTYPE_VARIANT、DBTYPE_XML、DBTYPE_STR、DBTYPE_BYTES として、または DBTYPE_IUNKNOWN 経由のインターフェイスとして取得できます。コンシューマが DBTYPE_BSTR、DBTYPE_WSTR、または DBTYPE_VARIANT を指定すると、プロバイダで XML インスタンスの型がユーザーが要求した型に変換され、対応するバインドで指定した場所に格納されます。

コンシューマが DBTYPE_IUNKNOWN を指定し、pObject 引数に NULL を設定した場合、または pObject 引数に IID_ISequentialStream を設定した場合、プロバイダから ISequentialStream インターフェイスが返されるので、列の XML データをストリーム出力できます。その後、ISequentialStream から XML データが Unicode 文字のストリームとして返されます。

プロバイダは DBTYPE_IUNKNOWN にバインドされた XML 値を返すときに、sizeof (IUnknown *) でサイズ値を報告します。この動作は、列が DBTYPE_IUnknown または DBTYPE_IDISPATCH としてバインドされる場合行われる動作、および正確な列のサイズを特定できない場合に DBTYPE_IUNKNOWN や ISequentialStream で行われる動作と同じです。

IRowsetChange インターフェイス

コンシューマは、列の XML インスタンスを 2 とおりの方法で更新できます。1 つ目の方法では、プロバイダで作成されるストレージ オブジェクト ISequentialStream を使用します。コンシューマは ISequentialStream::Write メソッドを呼び出して、プロバイダから返された XML インスタンスを直接更新できます。

2 つ目の方法では、IRowsetChange::SetData メソッドまたは IRowsetChange::InsertRow メソッドを使用します。この方法では、コンシューマのバッファに格納されている XML インスタンスを DBTYPE_BSTR 型、DBTYPE_WSTR 型、DBTYPE_VARIANT 型、DBTYPE_XML 型、または DBTYPE_IUNKNOWN 型のバインドで指定できます。

DBTYPE_BSTR、DBTYPE_WSTR、または DBTYPE_VARIANT の場合、コンシューマのバッファに存在する XML インスタンスがプロバイダによって適切な列に格納されます。

DBTYPE_IUNKNOWN と ISequentialStream では、コンシューマがどのストレージ オブジェクトも指定しない場合、ISequentialStream オブジェクトをあらかじめ作成して XML ドキュメントをこのオブジェクトにバインドし、このオブジェクトを IRowsetChange::SetData メソッドを使用してプロバイダに渡す必要があります。また、ストレージ オブジェクトを作成して pObject 引数に IID_ISequentialStream を設定し、ISequentialStream オブジェクトを作成してから、その ISequentialStream オブジェクトを IRowsetChange::SetData メソッドに渡すこともできます。どちらの場合も、プロバイダは ISequentialStream オブジェクトを使用して XML オブジェクトを取得し、それを適切な列に挿入できます。

IRowsetUpdate インターフェイス

IRowsetUpdate インターフェイスには遅延更新のための機能が用意されています。行セットで使用できるデータは、コンシューマが IRowsetUpdate:Update メソッドを呼び出すまで他のトランザクションで使用できません。

IRowsetFind インターフェイス

IRowsetFind::FindNextRow メソッドでは、xml データ型を処理できません。hAccessor 引数に DBTYPE_XML の列を指定して IRowsetFind::FindNextRow を呼び出すと、DB_E_BADBINDINFO が返されます。この動作は、検索対象の列の型とは無関係に行われます。その他のバインドの型では、検索対象の列が xml データ型の場合、FindNextRow が DB_E_BADCOMPAREOP を返して失敗します。

SQL Server Native Client ODBC ドライバ

SQL Server Native Client ODBC ドライバでは、xml データ型をサポートするために、さまざまな関数に多数の変更が加えられました。

SQLColAttribute

SQLColAttribute 関数に、SQL_CA_SS_XML_SCHEMACOLLECTION_CATALOG_NAME、SQL_CA_SS_XML_SCHEMACOLLECTION_SCHEMA_NAME、SQL_CA_SS _XML_SCHEMACOLLECTION_NAME という 3 つの新しいフィールド ID が追加されました。

SQL Server Native Client ODBC ドライバは、SQL_DESC_DISPLAY_SIZE 列と SQL_DESC_LENGTH 列に関して SQL_SS_LENGTH_UNLIMITED を報告します。

SQLColumns

SQLColumns 関数に、SS_XML_SCHEMACOLLECTION_CATALOG_NAME、SS_XML_SCHEMACOLLECTION_SCHEMA_NAME、SS_XML_SCHEMACOLLECTION_NAME という 3 つの新しい列が追加されました。既存の TYPE_NAME 列を使用して XML 型の名前が示されます。XML 型の列または XML 型のパラメータの DATA_TYPE は SQL_SS_XML になります。

SQL Server Native Client ODBC ドライバは、COLUMN_SIZE 値と CHAR_OCTET_LENGTH 値に関して SQL_SS_LENGTH_UNLIMITED を報告します。

SQLDescribeCol

SQLDescribeCol 関数で列のサイズを特定できない場合、SQL Server Native Client ODBC ドライバは SQL_SS_LENGTH_UNLIMITED を報告します。

SQLGetTypeInfo

SQL Server Native Client ODBC ドライバは、SQLGetTypeInfo 関数での xml データ型について、COLUMN_SIZE の最大値として SQL_SS_LENGTH_UNLIMITED を報告します。

SQLProcedureColumns

SQLProcedureColumns 関数には SQLColumns 関数に追加された列と同じ列が追加されました。

SQL Server Native Client ODBC ドライバは、xml データ型の COLUMN_SIZE の最大値として SQL_SS_LENGTH_UNLIMITED を報告します。

サポートされる変換

SQL データ型から C データ型に変換する際、SQL_C_WCHAR、SQL_C_BINARY、および SQL_C_CHAR は、次の条件下ですべて SQL_SS_XML に変換できます。

  • SQL_C_WCHAR: 形式は UTF-16 で、バイト順マーク (BOM) は付加されず、NULL で終端が示されます。

  • SQL_C_BINARY: 形式は UTF-16 で、NULL で終端は示されません。サーバーから受け取ったデータに BOM が追加されます。サーバーから空文字列が返されても、アプリケーションには BOM が返されます。バッファ長が奇数バイトの場合、データは適切に切り捨てられます。1 つの値が複数のチャンクで返される場合、それぞれを連結して正しい値を再構成できます。

  • SQL_C_CHAR: クライアント コード ページでエンコードされ、NULL で終端が示される、マルチバイト文字列形式です。UTF-16 を使用できるサーバーから変換するとデータが破損する場合があるので、このバインドはお勧めしません。

C データ型から SQL データ型に変換する際、SQL_C_WCHAR、SQL_C_BINARY、および SQL_C_CHAR は、次の条件下ですべて SQL_SS_XML に変換できます。

  • SQL_C_WCHAR: サーバーに送信されるデータには必ず BOM が追加されます。既にデータが BOM で始まる場合、この動作により、バッファの先頭に 2 つの BOM が存在することになります。サーバーでは、1 つ目の BOM からエンコードを UTF-16 と認識した後、その BOM を破棄します。2 つ目の BOM は、幅が 0 の改行を行わない空白文字として解釈されます。

  • SQL_C_BINARY: 変換が行われないので、データはそのままの状態でサーバーに渡されます。UTF-16 データは BOM で始まる必要があります。BOM で始まらない場合、エンコードがサーバーで適切に認識されません。

  • SQL_C_CHAR: データはクライアント上で UTF-16 に変換され、サーバーにそのまま SQL_C_WCHAR として送信されます (ただし、BOM が追加されます)。XML がクライアントのコード ページでエンコードされない場合、この変換が原因でデータが破損することがあります。

XML 標準では、UTF-16 でエンコードされた XML をバイト順マーク (BOM) で始める必要があります。BOM は UTF-16 の文字コードでは 0xFEFF です。SQL_C_BINARY バインドを使用する場合、そのバインドによってエンコードが暗黙的に決まるので、SQL Server Native Client から BOM が要求されることも追加されることもありません。SQL_C_BINARY バインドを使用する目的は、その他の XML プロセッサや XML ストレージ システムでの処理を簡単にすることです。この場合、BOM は UTF-16 でエンコードされた XML を示し、SQL Server を含め XML プロセッサの多くは値の先頭の数バイトを調べてエンコードを推定するので、アプリケーションで実際のエンコードを考慮する必要はありません。SQL_C_BINARY バインドを使用して SQL Server Native Client から受け取る XML データは、常に、BOM が付加された UTF-16 にエンコードされ、エンコード宣言は埋め込まれません。