1

一言で言えば、オラクルデータベースでは、現在の値に影響を与えずに、varchar2(8) である列 varchar2(16) を作成したいと考えています。私はすでにこれを試しましたが、奇妙なことをします。

私が試したクエリは、alter table SOME_TABLE modify (SOME_COL varchar2(16)); でした。しかし、上記のクエリを実行すると、テーブルに既に存在する値 (すべてではないものもあります) に '\0' が追加されます。

それで、私がやりたいことをする正しい方法は何ですか?

4

4 に答える 4

3

テーブル内の生データが変更されていることは非常に疑わしいです。あなたのコメントの中には、SQLPlus 以外のツールやアプリケーションを使用してデータを表示および処理していることを示唆しているものがあるため、何らかの方法でデータを誤って処理していないかどうかを確認する必要があると思います。

これは、ストレート SQLPlus で行ったことを再現しようとした例です。null バイトは既存のデータに追加されません。

SQL> create table foo (bar varchar2(8));

Table created.

SQL> insert into foo        
  2  select lpad(to_char(level),level)
  3    from dual 
  4    connect by level <=8;

8 rows created.

SQL> commit;

Commit complete.

SQL> select bar,dump(bar) from foo;

BAR
--------
DUMP(BAR)
--------------------------------------------------------------------------------
1
Typ=1 Len=1: 49

 2
Typ=1 Len=2: 32,50

  3
Typ=1 Len=3: 32,32,51

   4
Typ=1 Len=4: 32,32,32,52

    5
Typ=1 Len=5: 32,32,32,32,53

     6
Typ=1 Len=6: 32,32,32,32,32,54

      7
Typ=1 Len=7: 32,32,32,32,32,32,55

       8
Typ=1 Len=8: 32,32,32,32,32,32,32,56


8 rows selected.

SQL> alter table foo modify (bar varchar2(16));

Table altered.

SQL> select bar,dump(bar) from foo;

BAR
----------------
DUMP(BAR)
--------------------------------------------------------------------------------
1
Typ=1 Len=1: 49

 2
Typ=1 Len=2: 32,50

  3
Typ=1 Len=3: 32,32,51

   4
Typ=1 Len=4: 32,32,32,52

    5
Typ=1 Len=5: 32,32,32,32,53

     6
Typ=1 Len=6: 32,32,32,32,32,54

      7
Typ=1 Len=7: 32,32,32,32,32,32,55

       8
Typ=1 Len=8: 32,32,32,32,32,32,32,56
于 2009-06-04T14:52:58.423 に答える
2

実行しているコマンドは正しいです。

表示されている追加の文字がまだ存在していないことを確認してください。

于 2009-06-04T12:13:51.723 に答える
0

Dave Costa にほぼ同意します。データが古い「8」サイズであるとまだ考えているキャッシュがある可能性があります。「すべてではない」値が余分な \0 を取得すると言うとき、一貫性のある要因は何ですか? それらはすべて同じ長さ (たとえば 7 文字または 8 文字) ですか、それとも ALTER 列の実行中またはサーバーの再起動前に挿入された可能性がありますか?

解決策はありませんが、同様のことが数日前にここで提起されました。ノートを見比べてみてはいかがでしょうか。

于 2009-06-04T22:36:27.487 に答える
0

他に何もうまくいかない場合は、いつでも次のことができます。

  1. 新しい名前で新しい列を追加する
  2. UPDATE を使用して、古い列から新しい列に値をコピーします。
  3. 古い列を削除する
  4. 新しい列の名前を古い列の名前に変更します

長くて面倒で力ずくの方法ですが、他の方法で実行できない場合はうまくいきます...

于 2009-06-04T13:27:39.343 に答える