SQL Azure での日本語の扱い

元ネタ:
あれとアレは混ぜるな危険


テーブル/カラム名に日本語を使うことですが、使えるなら使っても良いんじゃない?と思います。
意図の伝わりやすさはメリットじゃないですかね?ツールが対応していないかもっていうのはあるかもしれませんが…。
現場の慣習に合わせますが、個人で使うなら日本語を使いますね。


また オンプレミスの SQL Server でテーブル/カラム名を日本語で付けている場合だってありますし、それを Windows Azure Services | Windows Azure で同期を取るケースだって出てくるんじゃないかな?
SQL Azure Data Sync でテーブル/カラム名を日本語付けている場合は、試していないので出来るか不明。。

  • 日本語データの文字化け

元ネタ:
2010-10-30 - waりとnaはてな日記
SQLWorld★ - SQLWorld★#3 で話したネタなので書いてみます。資料はそのうち公開されます。。
SQL Azure の照合順序は、SQL_LATIN1_GENERAL_CP1_CI_AS が使用されます。
そのため、VARCHAR は COLLATE(照合順序)を指定していないと文字化けします。NVARCHAR は文字化けしません。
なぜ文字化けするかというと、非 Unicode データ型(CHAR, VARCHAR, TEXT)の場合は、照合順序に応じたコードページを使用します。
照合順序の使用
コードページというのは、コード ページのアーキテクチャ にも載っていますが文字と数値コードを紐付けるマッピング表?みたいな物と認識しています。(文字コード?)
なので、照合順序が異なると使用されるコードページも異なり、文字化けが起きてしまうというカラクリです。
ちなみに Unicode 専用のデータ型(NCHAR, NVARCHAR, NTEXT) には、コードページは関連付られません。


次に、NVARCHAR に対して INSERT しているデータが文字化けている現象は、文字列リテラルは COLLATE を指定しないとデータベース既定の照合順序が使用されます。
定数 (Transact-SQL)
SQL Azure の場合、データベースに対しては照合順序を指定出来ないので、サーバーの照合順序がそのまま使用されると思います。
General Guidelines and Limitations (Windows Azure SQL Database)
そのため、文字化けしたデータが INSERT されてしまいます。
但し、文字列は 'N' プレフィックスを付けると UNICODE 扱いになるため、コードページが使用されず文字化けが起きません。


で、これは単に照合順序の設定の問題で SQL Azure に限った問題ではありません。
オンプレミスの SQL Server に対して、サーバーの照合順序を SQL_LATIN1_GENERAL_CP1_CI_AS に設定し、データベースの照合順序を指定しなければ、同じ事が起きます。
SQL World 勉強会では、今後クラウド等に SQL Server 持ってくかもしれないから、サーバーの照合順序は、LATIN にしといた方が良いかも…という様な意見も出ました。
SQL Azure Data Sync を使う等を考えた場合、これは有りな気がしますね。サーバーの照合順序は、識別子の照合順序 にも影響しますし、結構ハマります。