我不熟悉db2 / iSeries,但是我正在努力允许将多种语言的字符存储在db2表中。 将CCSID为37到1208的db2 / iSeries表中的列更改是否存在明显问题?如何切换CCSID会影响已存储在列中的数据?
答案 0 :(得分: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个字节...并且您需要22个字节用于CCSID 1208中的10个字符的DBSC字符串。除非你将长度增加到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。