私は何を見ていることは
- は、まず対話するカップルの異なるものに依存しているバグであると信じているが、データベース・キャラクタ・セットは、そのように(すなわち
AL32UTF8
)可変幅のキャラクタ・セットでなければなりません1文字の場合、最大4バイトのストレージが必要になることがあります。
- 第2に、列は文字長セマンティクスで宣言する必要があります
- 第11回から開始します。1では、テーブルのすべての行にデフォルト値を実際に格納するのではなく、データ・ディクショナリを更新するだけで、
NOT NULL
と宣言された列をテーブルに追加してDEFAULT
を追加すると最適化されました。
これらの両方が真の場合、返される値の長さは4で、CHR(0)
文字で埋められているようです。あなたが実際にテーブルに格納する値を強制する場合
SQL> select * from v$version;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
PL/SQL Release 11.2.0.1.0 - Production
CORE 11.2.0.1.0 Production
TNS for 64-bit Windows: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production
SQL> create table foo(col1 number);
Table created.
SQL> insert into foo values(1);
1 row created.
SQL> commit;
Commit complete.
SQL> alter table foo add c char(1 char) default 'N' not null;
Table altered.
SQL> alter table foo add constraint chk_foo check(c in ('Y', 'N'));
alter table foo add constraint chk_foo check(c in ('Y', 'N'))
*
ERROR at line 1:
ORA-02293: cannot validate (SCOTT.CHK_FOO) - check constraint violated
SQL> select c, dump(c) from foo;
C DUMP(C)
---- ------------------------------
N Typ=1 Len=4: 78,0,0,0
することは、あなたは何CHR(0)
パディングがありません期待される動作を取得します。だから私はテーブルに新しい行を挿入すると、それはパスします。
SQL> insert into foo(col1) values (2);
1 row created.
SQL> select c, dump(c) from foo;
C DUMP(C)
---- ------------------------------
N Typ=1 Len=4: 78,0,0,0
N Typ=1 Len=1: 78
また、値のみが「N」または「Y」であることをしている場合、実際にテーブル
SQL> update foo
2 set c = 'N'
3 where c != 'N';
1 row updated.
SQL> select c, dump(c) from foo;
C DUMP(C)
---- ------------------------------
N Typ=1 Len=1: 78
N Typ=1 Len=1: 78
の行に値を格納していない行を更新する
UPDATE
を発行することができ、なぜそれを作る(1バイト)? – tboneCHECK制約を 'CHECK(C IN(TO_NCHAR( 'N')、TO_NCHAR( 'Y')))'として書き直してください。関数の呼び出しがチェック制約で許可されているかどうかはわかりませんが、少なくともショットに値する可能性があります。興味深い。 –