lycheejam's tech log

チラ裏のメモ帳 | プログラミングは苦手、インフラが得意なつもり。

SQLServerに日本語データをInsertすると文字化けする。

概要

タイトルまんまです。
SQLServerに日本語データをInsertすると文字化けして「??????」と言った風になります。
解決したのでメモ。

目次

環境

SQLでInsert

文字化けした

普段、LINQ to EntitiesでデータのCRUDをやってる感じなんですが
生のSQL文でInsertしたくなったのでやってみたら文字化けしました。
件の文字化けSQLと実際のデータは下記の通り。

INSERT INTO EscortFlotillas(EscortFlotillaName) 
VALUES ('第1護衛隊群'), ('第2護衛隊群'), ('第3護衛隊群'), ('第4護衛隊群'), ('地方配備部隊'); 

f:id:HM_Atlas:20180527003539p:plain

A5:SQLの設定が悪いのかと疑って設定から文字エンコード方式がS_JISになっていたので UTF-8に変更して再度実行したが結果は変わらず...
とりあえずググる

文字化け解決

文字化けはSQL Serverと通信する際に非Unicode文字からUnicode文字に変換しているためにS_JIS文字コードUnicodeを参照しているから発生しているようだ。

日本語文字データの先頭にNをつけることで解決した。
正しくはNプレフィックスと言うらしい。

INSERT INTO EscortFlotillas(EscortFlotillaName) 
VALUES (N'第1護衛隊群'), (N'第2護衛隊群'), (N'第3護衛隊群'), (N'第4護衛隊群'), (N'地方配備部隊');

f:id:HM_Atlas:20180527004703p:plain

あれ?おかしいな、A5:SQL文字コード設定をUTF-8に変えたのだけど
SQL Server内の処理で変換が発生しているのか
A5:SQL文字コードって読み取り用ってことになるのかな?

調べていくとnvarcharなどn付きデータ型は上記のようにしないといけないようだ。

f:id:HM_Atlas:20180527005134p:plain

参考サイト様

雑感

先頭にNつけるとかCOBOLかよwwwwって思った。
COBOLも項目に日本語使うときはNって使うんすよね...