0

我对 db2/iSeries 不熟悉,但是我正在努力将多种语言的字符存储在 db2 表中。将 db2/iSeries 表中的列从 CCSID 37 更改为 1208 是否有任何明显的问题?切换 CCSID 将如何影响已存储在列中的数据?

4

1 回答 1

0

你会看到一些可怕的消息:

CREATE TABLE QTEMP/TEST (FLD1 CHAR (10 ) CCSID 37 NOT NULL WITH DEFAULT) 

ALTER TABLE QTEMP/TEST ALTER COLUMN FLD1 SET DATA TYPE CHARACTER (  
10) CCSID 1208 NOT NULL WITH DEFAULT  

CPD32CC - Change to field FLD1 may result in data loss.
--reason code 02: 02 - The new length is shorter than the current length.
CPA32B2 - Change of file TEST may cause data to be lost. (C I)
SQL0460 - Truncation of data may have occurred for ALTER TABLE of TEST in QTEMP.

但是假设数据是 alpha,你不应该丢失任何东西。

但是,尝试存储需要 DBCS 编码的 10 个字符的字符串将失败,因为列长度仍然只有 10 个字节……并且 CCSID 1208 中的 10 个字符的 DBSC 字符串需要 22 个字节。(尽管有关除非将长度增加到 28,否则截断不会消失?)

如果将类型更改为使用 UTF-16(CCSID 1200)的 NCHAR,系统会自动将 10 识别为字符长度并分配 20 个字节来存储它。

ALTER TABLE QTEMP/TEST ALTER COLUMN FLD1 SET DATA TYPE NCHAR(10) NOT NULL WITH DEFAULT 

话虽如此,假设您的文件是现有应用程序的一部分,更改表只是您的问题的开始。

现有的 RPG 程序必须重新编译并且很可能需要修改。

您可以通过使用从 Unicode 转换为 EBCDIC 的 LF(视图)层来绕过该要求。这有助于当前数据。但对实际需要 unicode 的新数据没有帮助。

此外,IBM iAccess for Windows 中包含的较旧的 5250 仿真器不支持 unicode。您需要使用较新的 Access Client Solution (ACS) 模拟器或基于浏览器的 IBM iAccess for Web。

于 2017-04-25T18:20:08.913 回答