sql >> データベース >  >> RDS >> Sqlserver

SQLServer-UTF-8エンコーディングでXMLタイプの列を定義する

    SQL Serverの列/フィールドをUTF-8エンコーディングとして定義する方法はありますか?

    いいえ、SQLServerの唯一のUnicodeエンコーディングはUTF-16リトルエンディアンです。これがNCHARの方法です。 、NVARCHARNTEXT (SQL Server 2005で廃止されたため、これを新しい開発で使用しないでください。さらに、NVARCHAR(MAX)と比較すると問題があります。 とにかく)、およびXML データ型が処理されます。他のRDBMSで許可されているようなUnicodeエンコーディングを選択することはできません。

    次の3つのルールに従う場合、UTF-8でエンコードされたXMLをSQLServerに挿入できます。

    1. 着信文字列はデータ型VARCHARである必要があります 、NVARCHARではありません (NVARCHARとして は常にUTF-16リトルエンディアンであるため、エンコーディングを切り替えることができないというエラーが発生します。
    2. XMLには、XMLのエンコーディングが実際にUTF-8であることを明示的に示すXML宣言があります。<?xml version="1.0" encoding="UTF-8" ?>
    3. バイトシーケンスは実際のUTF-8バイトである必要があります。

    たとえば、悲鳴を上げる顔の絵文字を含むUTF-8でエンコードされたXMLドキュメントをインポートできます(リンクをたどると、その補助文字のUTF-8バイトシーケンスを取得できます):

    SET NOCOUNT ON;
    DECLARE @XML XML = '<?xml version="1.0" encoding="utf-8"?><root><test>'
                        + CHAR(0xF0) + CHAR(0x9F) + CHAR(0x98) + CHAR(0xB1)
                        + '</test></root>';
    
    SELECT @XML;
    PRINT CONVERT(NVARCHAR(MAX), @XML);
    

    戻り値([結果]タブと[メッセージ]タブの両方):

    <root><test>😱</test></root>
    

    @Shnugoの回答に対するコメントで言及されました:

    utf-8ヘッダーを含むutf-8エンコードストリームをSQLServer2013NVARCHAR列に挿入するのに問題はありませんでした。隠れた問題はありますか?

    いいえ、UTF-8でエンコードされたものをNVARCHARに保存していません 列(さらに、SQL Serverの2013バージョンはありませんが、それはおそらく単なるタイプミスです)。 NVARCHAR これまでUTF-16リトルエンディアンのみです。ほとんどの場合、SQLServerへの転送中にデータベースドライバーによってUTF-8ストリームがUTF-16LEに変換されました。これはXML列が使用するのと同じエンコーディングですが、XML列はストリームをUTF-8からUTF-16に変換しようとしましたが、すでにUTF-16であるため失敗しました。これは、SQL Serverを終了する途中で、NVARCHARに格納されているXMLドキュメントも意味します。 列には、エンコーディングがUTF-8であることを示すXML宣言が引き続き含まれますが、UTF-8ではありません。

    SQL Server XMLから出力されるUTF-16LEを変換したくないために、途中でデータをUTF-8にする必要がある場合 またはNVARCHAR UTF-8に変換すると、データをVARBINARY(MAX)として保存する以外に選択肢はありません。 。



    1. SQLでゼロ除算を処理する方法

    2. すべてのストアドプロシージャを一覧表示するクエリ

    3. TSQLを使用してデータベース内のすべてのテーブルのリストを取得するにはどうすればよいですか?

    4. JavaからMySQLデータベースを作成する