SQLServerに作成したデータベースの文字コード(コードページ)が何なのか実機から調べた際の方法を紹介します。
#環境
SQL Server 2014
#対象のデータ型
今回調査対象としたのは、文字列型のデータ型であるchar(varchar)、nchar(nvarchar)で定義された列とします。
#文字コードの設定箇所
SQLServerには文字列の区別、ソート順を決定する照合順序という定義がありますが、文字コードはそれと同一箇所で設定します。
設定する箇所は以下となります。
1.サーバに設定(SQLServerインストール時に指定)
2.データベースに設定(CREATE DATABASE句で指定)
3.テーブルに設定(CREATE TABLE句で指定)
4.列に設定(CREATE TABLE句で指定)
#優先順位
列に定義 > テーブルに定義 > データベースに定義 > サーバに定義
となります。
列に定義がなければテーブル定義を、テーブルに定義がなければデータベースの定義を、データベースに定義がなければサーバの定義が使用されることになります。
#確認方法
確認方法は以下となります。
###確認したい列はUNICODE型か非UNICODE型か
頭にnが付かないchar型(char、varchar、text)= 非UNICODE型
であり、
頭にnが付くchar型(nchar、nvarchar、ntext)= UNICODE型
となります。
■非UNICODE型の場合
→ 照合順序の確認へ
■UNICODE型の場合
→ 文字コード(コードページ)はUTF-16確定。
###照合順序の確認
非UNICODE型の列の照合順序を確認します。
SELECT name, collation_name FROM sys.columns WHERE name = N'確認したい列名';
name collation_name
----------------------------------------
確認したい列名 Japanese_CI_AS
この列の照合順序は
Japanese_CI_AS
と出ました。
今回確認したいのは文字コード(=コードページ)ですので、この照合順序がShift-JIS形式なのかUTF-8形式なのか以下のクエリで調べます。
SELECT COLLATIONPROPERTY('Japanese_CI_AS', 'CodePage')
----------------------------------------
932
932
と出ました。
コードページ932とはいわゆるShift-JISです。
Code Page Identifiers
Identifier | .NET Name | Additional information |
---|---|---|
932 | shift_jis | ANSI/OEM Japanese; Japanese (Shift-JIS) |
1200 | utf-16 | Unicode UTF-16, little endian byte order (BMP of ISO 10646); available only to managed applications |
65001 | utf-8 | Unicode (UTF-8) |
20932 | EUC-JP | Japanese (JIS 0208-1990 and 0212-1990) |
#結論
今回確認した環境の文字コードは
■非UNICODE型の列
→ Shift-JIS
■UNICODE型の列
→ UTF-16
であることが確認できました。
#補足
Shift-JISで定義された列にUTF-8のコードの文字を挿入すると、Shift-JISに存在する文字コードの場合は指定した文字とは異なる文字として認識/格納され、Shift-JISに存在しない文字コードの文字を挿入すると、???となって格納されてしまいます。
これは接続ドライバによっては変換を行ってくれるものもありますが、負荷を軽減する意味でもアプリケーションが指定する文字コード(セット)とDB側の文字コード(セット)は統一した方がよいかと思います。