プログラマメモ2 - programmer no memo2

おらくる VSIZE は内部でのサイズを返します。 2011/01/30

oracleです。VSIZEはデータベース内部でのサイズを返してくれるそうです。
で、実験です。
下記のようなテーブルを作成します。

create table bbb
(
a1 NCHAR(1),
a2 NVARCHAR2(1),
a3 CHAR(1 BYTE),
a4 CHAR(1 CHAR),
a5 VARCHAR2(1 BYTE),
a6 VARCHAR2(1 CHAR)
)


ちなみにキャラクターセットの確認
select * from nls_database_parameters where parameter ='NLS_CHARACTERSET'


結果は
AL32UTF8


適当にINSERTします。これってどうなると思います?
INSERT INTO bbb VALUES('あ', 'あ', 'あ', 'あ', 'あ', 'あ')


そうですエラーになります。
SQL実行中に以下のエラーが発生しました。
ORA-12899: 列"SYSTEM"."BBB"."A3"の値が大きすぎます(実際: 3、最大: 1)


では、次ぎにどうなるでしょうか。
INSERT INTO bbb VALUES('あ', 'あ', '1', 'あ', '1', 'あ')


微妙にわかりづらいですが、5つめのカラムに全角の"1"を入れようとしてます。

最後にこれで入ります。
INSERT INTO bbb VALUES('あ', 'あ', '1', 'あ', '1', 'あ')

列長セマンティックを指定しているのでBYTEは1バイトしか入らないです。

サイズをみてみます。
select VSIZE(a1), VSIZE(a2), VSIZE(a3), VSIZE(a4), VSIZE(a5), VSIZE(a6) from bbb


わかりずらいけど、下記のようになります。
VSIZE(A1) VSIZE(A2) VSIZE(A3) VSIZE(A4) VSIZE(A5) VSIZE(A6)
2 2 1 3 1 3


NCHARとCHARで何故サイズが違うのか?

: