質問: **SQLserver2008のchar型の桁数** ### やりたい事 char(2)の項目を半角英数字のみを許容している。 半角カナも許容したい。 ### 試してみた事 char(2),nchar(2)のテストテーブルを作成して実際にデータをinsertしてみた。 結果、char(2),nchar(2)ともに半角カナは登録できた。 また、UNICODE指定してもinsertできた。 ``` 1.insert into test values ('アア','イイ') 2.insert into test values (N'アア','イイ') 3.insert into test values ('アア',N'イイ') ``` いづれもエラーにならなかった。てっきり、2のinsert文でエラーになると想定していた。 さらに ``` 4.select DATALENGTH('アア') -- 結果は2 5.select DATALENGTH(N'アア')-- 結果は4 ``` ### わからないこと char(2)は2byteサイズなので'アア'は設定できてもUNICODE指定して、N'アア'とすると4byte必要 というのが私の解釈なのですが、なぜかinsertでエラーとならず、登録できるのです。。。 ### 最終的な目的 やりたい事が、問題ないことを論理的に説明したい。 今のままだとどうしても、腹に落ちなくて。。。 ひとまず、ここまで読んでくださってありがとうございます。 場合によっては、さくっと説明できる内容ではないのかもしれませんがその場合はヒントでもいいのでご教示ください。 よろしくお願いいたします。
回答: > > てっきり、2のinsert文でエラーになると想定していた。 > > > 「暗黙の型変換」によるものでしょう。 `N'アア'`というリテラルは`nchar`か`nvarchar`のどちらかになると思いますが、それを`char(2)`の列に挿入しようとしたことにより暗黙の型変換が発生し、自動的に`char(2)`に変換されます。 どのようなケースで暗黙の型変換が発生するか、はMSDNに記載されています。 データ型の変換 (データベース エンジン).aspx) 暗黙の型変換は便利なようにも見えますが、意図しない結果を起こすこともままあるので、極力発生させないよう気をつけたほうがいいです。