SQL Serverの列/フィールドをUTF-8エンコーディングとして定義する方法はありますか?
いいえ、SQLServerの唯一のUnicodeエンコーディングはUTF-16リトルエンディアンです。これがNCHAR
の方法です。 、NVARCHAR
、NTEXT
(SQL Server 2005で廃止されたため、これを新しい開発で使用しないでください。さらに、NVARCHAR(MAX)
と比較すると問題があります。 とにかく)、およびXML
データ型が処理されます。他のRDBMSで許可されているようなUnicodeエンコーディングを選択することはできません。
次の3つのルールに従う場合、UTF-8でエンコードされたXMLをSQLServerに挿入できます。
- 着信文字列はデータ型
VARCHAR
である必要があります 、NVARCHAR
ではありません (NVARCHAR
として は常にUTF-16リトルエンディアンであるため、エンコーディングを切り替えることができないというエラーが発生します。 - XMLには、XMLのエンコーディングが実際にUTF-8であることを明示的に示すXML宣言があります。
<?xml version="1.0" encoding="UTF-8" ?>
。 - バイトシーケンスは実際の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)
として保存する以外に選択肢はありません。 。