Help us understand the problem. What is going on with this article?

Azure Synapse Analytics の SQL Serverless (SQL on-demand) で 日本語が文字化けした時の対応例

背景

Synapse では、リンク設定されている Azure Storage や Cosmos DB の内容などを、右クリックから SQL文を直ぐに作成してくれる機能があります。

image.png

Microsoft が用意してくれているサンプルデータは英語のものが多いため、日本語のデータでクエリ実行すると文字化けする事が多くあります。

SQL Serverless は、データを個別に持ちません。Azure Data Lake Storage Gen2 上にファイルとして見える状態にしています。ですので、ファイルを確認すると日本語で表示できるのに、Azure Synapse Studio で表示させようとすると、文字化けする事になります。

image.png

これは、扱っている SQL Serverless (on-demand) の文字列の照合順序の設定に起因しているみたいです。
照合順序は、Server - Database - Table - Column の単位で柔軟に設定ができます。が、Synapse Studio の利便性を考えると、Table 以下では面倒です。Serverの設定は出来ないですので (恐らく)、現実的な Database レベルでの設定を行います。

データベースの照合順序の設定または変更:

https://docs.microsoft.com/ja-jp/sql/relational-databases/collations/set-or-change-the-database-collation?view=sql-server-ver15

画面の右上を見ると [master] Database に接続をしています。

image.png

以下のT-SQLクエリで設定されている照合順序を確認します。

SELECT CONVERT (varchar(256), SERVERPROPERTY('collation'));

結果

SQL_Latin1_General_CP1_CI_AS

要は西洋圏の文字列です。
UNICODEの照合順序を設定します。

照合順序情報の表示
https://docs.microsoft.com/ja-jp/sql/relational-databases/collations/view-collation-information?view=sql-server-ver15

手順

1. SQL Database に新規 Database を作成し、その際に照合順序を設定

opendataの部分は、お好きな名前に変更ください😊

CREATE DATABASE opendata COLLATE LATIN1_GENERAL_100_CI_AS_SC_UTF8

終了です😊

2. 確認

SQL Serverless で、T-SQL 実行時に、Database を切り替えてください。

image.png

master:
image.png

照合順序を設定した database:

image.png

まとめ

Synapase の SQL Serverless は、SQL Engine で作られている事に立ち返る事が重要です。そして、文字化けについての対応は、ストレージへの格納方法、抽出するプロトコルの設定、アプリケーションの表示など多岐の場面で行われています。UNICODEの恩恵を私たちは知らないうちに受けているんだなーと改めて確認できました。

Spark で問題が起こったら、どうしたらいいのかも、対応しやすいと思います😎

2020/11/17 追記:
Always use UTF-8 collations to read UTF-8 text in serverless SQL pool:
https://techcommunity.microsoft.com/t5/azure-synapse-analytics/always-use-utf-8-collations-to-read-utf-8-text-in-serverless-sql/ba-p/1883633

dahatake
Software Engineer | Architect | Applied Data Scientist @ Microsoft
https://daiyuhatakeyama.wordpress.com/
microsoft
マイクロソフトのメンバーが最新の技術情報をお届けします。Twitterアカウント(@msdevjp)やYouTubeチャンネル「クラウドデベロッパーちゃんねる」も運用中です。
https://aka.ms/MSFT-Docs-JPN
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away