[SQLServer] nvarchar(10)に10文字入るとは限らない:サロゲートペア
nvarcharはユニコードで値を格納する型で、半角全角の区別がありません。
入力画面で入力された文字に対して何バイトなのかを意識する必要がなく、入力文字数で判断すればいいので便利です。
と思っていたのですが、
必ずしもそうとは限らないようです。
それは環境依存文字 サロゲートペア文字が含まれる場合です。
サロゲートペアでは2文字分の領域を使って1つの文字を表現します。
有名なところでは、吉野家の正式名で使われる吉という字です。(土に口のほう)
※ブログ制限で機種依存文字が投稿できないので、置き換えて読んでください。
実際確認してみます。
テスト用テーブル作成
CREATE TABLE Test(value1 NVARCHAR(10)); |
標準字体の吉野家 10文字入る
INSERT INTO Test VALUES (N‘吉野家吉野家吉野家吉‘); |
文字数を数えると10文字
SELECT LEN(N‘吉野家吉野家吉野家吉‘) |
↓※ブログ制限で機種依存文字が投稿できないので、置き換えて読んでください。
サロゲート文字の吉野家
INSERT INTO Test VALUES (N‘吉野家吉野家吉野家吉‘); |
→エラーになる
テーブル’Test’、列’value1’で文字列またはバイナリデータが切り捨てられます。切り捨てられた値:’吉野家吉野家吉‘。
SELECT LEN(N‘吉野家吉野家吉野家吉‘) |
“吉”の字が1文字で2文字分のエリアを使っているため、合計文字数は14文字になる
環境依存文字は使わないに越したことはないのですが、人の名前など固有名詞ではよく出てきます。
環境依存文字はエラーにするというのもありではありますが、IMEでは普通に入力できる文字なのでエラーは不親切ですね。(スマホだと一覧にはでてきませんね。)
以上のことから、安全を期すのであれば、例えば10文字まで入力できる値であれば、nvarchar(20)としておくのが安全です。
全部サロゲート文字というのはテストのとき以外はありえないと思いますが。。。
ギリギリの文字数でカラムサイズを設定される際は注意ください。
== ランキングに参加しています。ぜひクリックお願いします ==
[SpringBoot] application.propertiesに独自プロパティを追加する [SQL Server] 2016インストール時にエラーが出て中断する