varcharの列にUnicode文字をINSERTしてみる
from SQL Serverの文字列型varchar nvarchar
環境
code:select.sql
select @@VERSION;
table:result
(列名なし)
Microsoft SQL Server 2017 (RTM) - 14.0.1000.169 (X64) (略)
確認用テーブルの準備
code:create.sql
CREATE TABLE #T (
vc varchar (max)
, nvc nvarchar(max)
-- varcharからnvarcharに変えてみる
, altvc varchar (max)
-- 照合順序をJapanese_Bushu_Kakusu_100_CI_AS_SCに設定してみる
, kakusu_nvc nvarchar(max)
, text nvarchar(max)
);
varcharの確認
カラムの情報
code:select_INFORMATION_SCHEMA.sql
SELECT
COLUMN_NAME AS column_name,
DATA_TYPE AS type,
CHARACTER_SET_NAME AS character_set,
COLLATION_NAME AS collation,
CHARACTER_MAXIMUM_LENGTH AS max_len,
CHARACTER_OCTET_LENGTH AS octet_len
FROM
tempdb.INFORMATION_SCHEMA.COLUMNS
WHERE
COLUMN_NAME = 'vc';
table:result
column_name type character_set collation max_len octet_len
vc varchar cp932 Japanese_CI_AS 3 3
charcter_setがCP932なのでShift_JIS相当の文字コードが使用される
文字をINSERTしてみる
code:truncate_and_select.sql
TRUNCATE TABLE #T;
INSERT INTO #T(vc) VALUES ('a');
INSERT INTO #T(vc) VALUES ('愛');
INSERT INTO #T(vc) VALUES ('𩸽');
SELECT vc, LEN(vc) AS length, DATALENGTH(vc) AS data_length,
CAST(vc AS varbinary(max)) AS bin FROM #T;
table:result
vc length data_length bin
a 1 1 0x61
愛 1 2 0x88A4
?? 2 2 0x3F3F
愛はShift_JISで0x88A4なのでShift_JIS(CP932)で格納されていることがわかる
JIS X 0208#6296cb30f45820000076f67a
Shift_JISに収録されていない文字は?(0x3F)で表現される
未使用
code:drop.sql
-- 一時テーブルなのでログアウトしたら消えるが明示的に消したいとき用途
DROP TABLE tempdb.#T;