PG.Lib

主にUWP、C#に関することやガジェット系

SQL Server の文字コード

データ内に格納する文字コードは varchar - nvarchar で扱いが明示的に違うが、データベース及びSQL Server Management Studioで扱う文字コードについてはあまり情報がない。

特にストアドプロシージャ等のデータベースへ格納されるオブジェクトについては、エンコードの違いでSQLファイルへ出力した際で文字化けしてしまう。

このあたりの扱いが 2012 と 2014 で変わったっぽい??

SQL Server 2012

具体例を示しづらい環境だが、SQL Server 2012の場合、既定の状態でインストールされたインスタンスの場合の例だと文字コードはShift-JISになっている模様。

ストアド、ファンクションはデータベース上に、Shift-JISで保存されており、SSMSではShift-JISで出力や更新を行っているっぽい。

このあたりは、照合順序にも影響されるとの情報があるが、既定ではJapanese_CI_ASになっていた。

SQL Server 2014

こちらも具体例は出せないが、既定の状態でインストールするとJapanese_CI_ASとなるが、ストアド、ファンクションはUTF-8で保存されている模様。

SSMSもファイル出力、更新はUTF-8で処理しているみたい。ただ、クエリエディターへの出力では文字化けせず正しく出せている。

エンコードが違う

SQL Server 2012 / 2014 付属のSSMSどちらも互換がありデータベース接続そのものは問題なくできる。

違うバージョンのDBに接続してファイル出力や更新をした場合には、エンコードの違いが生まれてしまう模様。

2014のSSMSを使って、2012のデータベースへ接続しストアドを作成するとUTF-8で作成されているっぽい。

問題となったこと

sqlcmdを使ってコマンドプロンプトからSQLファイルでストアドの更新をかけた場合に、盛大に文字コードの影響を受けコメントの日本語が文字化けするようになってしまった。

このケースでは、SSMS2014で出力して、sqlcmdで2014への更新をかけている。

(2012はあまり関係ないが、今まではこんなことなかったよなー?と思った次第)

もちろん、SQLファイルをS-JISに変換すれば問題ないが、繰り返し作業で使うのでオペミスを減らすためにもそのまま使いたい。

あとUTF-8をBOM付きにすれば問題なかった。

整理すると

ただ、SSMSを使っている分には正しく表示出来ているので、問題を切り分けると

  • SSMSでの出力がUTF-8になる
  • sqlcmdで実行すると文字化け実行になる

この2点だなと整理できてきた。

SSMSの設定でファイル出力のエンコードを変えれるか? sqlcmd もしくは コマンドプロンプトエンコードを正しく設定できるか?

これが解決の糸口だ!

解決に向けて

コマンド実行時にエンコード指定するのがベストかな?思い、 chcp でUTF-8にしても結果は変わらなかった。

(使い方が悪いのかな??)

とりあえずSSMSの設定を見てるけど、BOM警告の設定はあるけど、出力そのものの設定は見当たらない。

sqlcmdのオプションを調べたら、案の定、入力/出力それぞれのエンコード指定があった。

-f i:65001

を入れてあげれば、UTF-8として実行されるようになる。

でもこの変更って…

sqlcmdとか使ってなければ問題なさそうだけど、大人数で開発しててSSMSのバージョンが違った場合って、エンコードがぐっちゃぐちゃになる可能性を秘めてるってことだよねー。

精神衛生上よくないねw