1

简而言之 - 在 oracle db 中,我想创建一个列 varchar2(16),它现在是 varchar2(8),而不影响值 presnet。我已经尝试过了,它会做一些奇怪的事情。

我尝试的查询是 - alter table SOME_TABLE modify (SOME_COL varchar2(16)); 但是当我运行上述查询时,表中已经存在的值(有些不是全部)会在它们后面附加 '\0'。

那么,做我想做的事情的正确方法是什么?

4

4 回答 4

3

表中的原始数据正在被更改是非常值得怀疑的。由于您的一些评论暗示您正在使用 SQLPlus 以外的工具和应用程序来查看和处理数据,我认为您需要查看它们是否以某种方式错误处理了数据。

这是一个示例,我试图重现您在直接 SQLPlus 中所做的事情。没有空字节附加到现有数据:

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

如果没有其他方法适合您,您可以随时执行以下操作:

  1. 添加具有新名称的新列
  2. 使用 UPDATE 将旧列中的值复制到新列
  3. 删除旧列
  4. 将新列重命名为旧列

这是漫长而繁琐和蛮力的,但如果你不能以任何其他方式完成它,它会起作用......

于 2009-06-04T13:27:39.343 回答
0

大多同意戴夫·科斯塔的观点。可能有一个缓存仍然认为数据是旧的“8”大小。当你说“一些不是全部”的值得到额外的 \0 时,一致的因素是什么?它们的长度是否相同(例如七个或八个字符),或者它们可能是在完成 ALTER 列时或在某些服务器重新启动之前插入的?

没有解决方案,但是几天前这里提出了类似的问题。也许尝试比较笔记。

于 2009-06-04T22:36:27.487 回答