Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 12.0.1 » SQL Anywhere サーバー SQL の使用法 » データベースにおける XML の使用 » XML としてのクエリ結果 » クエリ結果を XML として取り出すための FOR XML 句の使用

 

不正な XML 名のエンコーディング

SQL Anywhere は、次のルールを使用して、XML 名として有効ではない名前 (たとえば、スペースを含むカラム名) をエンコードします。

XML には、SQL 名のルールとは異なる名前のルールがあります。たとえば XML 名にはスペースを使用できません。カラム名などの SQL 名が XML 名に変換されると、XML 名で有効でない文字はエンコードされるかエスケープされます。

エンコードされた各文字について、エンコーディングは文字の Unicode のコードポイント値が基になり、16 進数で表されます。

  • ほとんどの文字のコードポイント値は、16 ビット、または 4 桁の 16 進数で表すことができ、_xHHHH_ というエンコーディングが使用されます。このような文字に対応する Unicode 文字の UTF-16 値は、16 ビットワード 1 つです。

  • コードポイント値が 16 ビットよりも多く必要な文字では、8 桁の 16 進数が使用され、エンコーディングは _xHHHHHHHH_ になります。このような文字に対応する Unicode 文字の UTF-16 値は、16 ビットワード 2 つです。ただし、エンコーディングには UTF-16 値ではなく、Unicode のコードポイント値 (通常は 16 進数で 5 または 6 桁) が使用されます。

    たとえば、次のクエリには、スペースを持つカラム名が含まれています。

    SELECT EmployeeID AS "Employee ID"
    FROM Employees
    FOR XML RAW;

    そのため、次の結果が返されます。

    <row Employee_x0020_ID="102"/>
    <row Employee_x0020_ID="105"/>
    <row Employee_x0020_ID="129"/>
    <row Employee_x0020_ID="148"/>
    ...
  • アンダースコア (_) は、次に文字 x が続く場合、エスケープされます。たとえば、名前 Linu_x は Linu_x005F_x のようにエンコーディングされます。

  • コロン (:) は、エスケープされません。そのため、FOR XML クエリを使用して、名前空間宣言と修飾された要素名、属性名を生成できます。

ヒント

Interactive SQL で FOR XML 句を含むクエリを実行する場合は、truncation_length オプションを設定するとカラム長を増やせます。

 参照