前回無事にRDSに接続できたわし。
「なんかAWS理解できるようになっちゃってインフラのプロになれんじゃね?」
とかイキっておりました。
今回はそんなイキったやつが照合配列についてお勉強するお話です。
「え?日本語でおk?じゃないの??」
データ型さえ指定すれば文字列データ入れられるじゃんと考え、日本語でデータを入力してINSERTしたものの、、、
まさかの文字化け。
データ型の指定やクエリも以前ローカルのサーバー使ったときと同じにしていたので、「なんでRDSだとおかしくなっちゃうん??」ってなりましたね。。
要デフォルト確認
そもそも論ですが、SQLServerとRDSではデフォルトの照合配列が異なっています。
SQLServerではJapanese_CI_ASが、RDSではSQL_Latin1_General_CP1_CI_ASがデフォルトで設定されています。
SQL_Latin1_General_CP1_CI_ASについては日本語入力が対応していないため、日本語で文字列を入れると「??」になってしまっていたようなのです。
しかも、RDSの照合配列を決められるのはDBインスタンス作成時のみのため、作成後に「あ!!日本語のデータ入れないと!!」となってもインスタンス自体での変更はできないのです、、
いやーでもテーブル作った後にデータ型変更したくなることくらいあるよね??
なんとか変更くわえたいものやなあ。
データベースだけなら何とかなりそう
DBインスタンスは変更できないことがわかったので、データベースエンジン自体の設定をいじっていくことに。
SSMSに該当のインスタンスでログインしたら、オブジェクトエクスプローラーのツールタブから、「オプション」を選択。左側の一覧からデザイナー>テーブルデザイナー及びデータベースデザイナーを選択します。
次に、テーブルオプション画面で、赤で囲った箇所のチェックを外します。
タブを閉じたら、オブジェクトエクスプローラーからデータ型を変えたいデータベースを右クリックし、「プロパティ」を選択します。
左側の「オプション」を選択すると、照合配列を変更できる画面が表示されるので、ここからJapanese_CI_ASに変更します。
この時点で該当するデータベース自体の照合配列を変えることが可能になり、以降データベース上で作成されるテーブルの照合配列はJapanese_CI_ASとなります。
それでは、プロジェクト側からデータ型を変更していきます。
まずVisual Studioで該当プロジェクトを開き、表示>サーバーエクスプローラーから照合配列変更前に作ったテーブルを右クリックし、「テーブル定義」を選択します。
CREATE文を記述した際に設定したテーブル定義がひょうじされるので、「COLLATE SQL_Latin1_General_CP1_CI_AS」の部分だけを消して更新ボタンを押します。
この状態でデバックを実行し、日本語のデータを入れると、
ああ・・!ちゃんと日本語入力が反映されておる・・!!
ミスったと思っても案外何とかなる
正直まだまだ勉強不足感強すぎて
「そもそもなんでインスタンスの照合配列はSQL_Latin1_General_CP1_CI_ASのままなのに日本語入力できたのか」
とかはまだ調べられていないのが現状です。
とはいえ、「やっちまったー」となっても、細々と調査を続けたことで対処方法がわかったのはわかったなあと思っています。