我是否可以在不影响现有数据的情况下将列从VARCHAR更改为VARCHAR FOR BIT DATA

时间:2014-08-07 09:29:58

标签: database db2

我正在使用以下查询来更改列类型,这在我的示例表

上似乎很好

ALTER TABLE temp ALTER COLUMN Col SET DATA TYPE VARCHAR(15)用于位数据 去

在我的生产数据上使用它之前,我想确保它不会对现有DATA产生任何问题。

2 个答案:

答案 0 :(得分:0)

不可能说它不会造成任何问题。问题取决于您当前的数据模型:当前表DDL。你必须检查很多东西:

  • 存储
  • 交易
  • 行溢出
  • 使用列的例程
  • ...

因此,最好使用生产数据测试非生产数据库中的更改,以验证它不会产生任何影响。

答案 1 :(得分:0)

tl;博士:

将列从VARCHAR(15)更改为VARCHAR(15) FOR BIT DATA修改表格中的数据。但是,您获得的数据的表示将会发生变化。


当您在具有VARCHAR()列的表中插入行时,DB2会将您从客户端应用程序的代码页插入的数据转换为数据库的代码页(如果它们不同) ,然后将数据写入表中。查询该数据时,DB2从VARCHAR()列获取字节字符串,并使用数据库代码页生成字符。

当您使用FOR BIT DATA时,DB2会将数据流写入列而不包含任何代码页。它只是写入字节流。查询数据时,DB2将字节流作为十六进制字符串返回。

因此,如果您将'Hello'插入VARCHAR(15)列,则会在内部将其存储为5个字节:x'48656C6C6F' (假设UTF8代码页)。查询此列时,DB2会根据UTF8代码页将此5个字节转换回'Hello'

但是,如果将列更改为VARCHAR(15) FOR BIT DATA,那么当您查询数据时,DB2将返回未编码的字节字符串:x'48656C6C6F'

因此:虽然数据本身并没有改变,但是当您查询时,您所获得的内容会发生变化。

最后注意事项:将列更改为VARCHAR(15) FOR BIT DATA是单向操作。剥离与列中数据关联的代码页后,即使您更改了列并删除FOR BIT DATA子句,DB2也始终将数据作为字节流返回。