PG.Lib

アプリ開発関連とかガジェット関連とか

SQL Server の文字コード

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

特にストアドプロシージャ等のデータベースへ格納されるオブジェクトについては、エンコードの違いで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 2014からは、既定のエンコードはUTF-8に統一されたと思われる。

エンコードが違う

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

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

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

問題となったこと

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

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

(この時点ではSQL Server 2012はあまり関係ないが、今まではこんなことなかったよなー?と思った)

もちろん、SQLファイルをShift-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

SQL Server 2016の教科書 開発編

SQL Server 2016の教科書 開発編