尝试导出 table 时与 DB2 上的 CCSID 相关的问题
Issues related to CCSID on DB2 while trying to export a table
我一直在尝试将 table 从 db2 从一个外部源导出到另一个外部源,到目前为止,我注意到在尝试将其导入源 table 时出现错误.
我在 shell 脚本上使用它:
myDate=$(date +"%Y%m%d%I%M")
myPath=/tmp/test
myDataSource="external"
myTableName=tableSchema.sourceTable
db2 +w -vm "export to $myPath/$myDataSource.$myTableName.$myDate.ixf of ixf
messages $myPath/$myDataSource.$myTableName.$myDate.ixf.xmsg
SELECT * from $myTableName"
进一步调查,似乎插入了一个奇怪的字符“▒”。我检查了来源,没有任何奇怪的字符。所以在检查细节后我发出了这个命令:
select *
from SYSIBM.SYSCOLUMNS
where
tbcreator = 'SOURCESCHEMA'
and tbname = 'SOURCETABLE'
for fetch only with ur;
这表明源列上的 CCSID 是 37。我在目标模式上做了同样的事情,列的 CCSID 是 1208。
当我再次尝试导出 table 时强制它转换为 CCSID 1208 添加 修改代码页=1208:
db2 +w -vm "export to $myPath/$myDataSource.$myTableName.$myDate.ixf of ixf
modified by codepage=1208
messages $myPath/$myDataSource.$myTableName.$myDate.ixf.xmsg
SELECT * from $myTableName"
这会导致脚本运行,但我收到此警告:
SQL3132W The character data in column "COLUMN" will be truncated to size "4".
所述列在源和目标上的大小相同,但似乎由于 CCSID,我需要更改目标上的大小(我无法更改源上的任何内容和更改 CCSID目标会破坏目标上的东西)所以,我的问题是:
- 如何根据编码计算每个 varchar/char 列所需的大小,例如,如果 CCSID 37 上的 varchar(4) 需要 varchar(5) 来保存 CCSID 1208 的值?
是否可以这样做:
SELECT
CAST(COLUMN as VARCHAR(12) CCSID 1208) -- 对于所有列
来自 tableSchema.sourceTable;
所以我不会丢失这些字符串的任何部分。
- 数字呢?
谢谢!
最后,我最终使用了这个
SELECT
CAST(COLUMN AS VARCHAR(12) CCSID 1208) as COLUMN,
CAST(COLUMN2 AS VARCHAR(12) CCSID 1208) as COLUMN2,
(...),
CAST(COLUMNM AS VARCHAR(12) CCSID 1208) as COLUMNM,
FROM tableSchema.sourceTable;
跨代码页转换,没有出现截断。
我一直在尝试将 table 从 db2 从一个外部源导出到另一个外部源,到目前为止,我注意到在尝试将其导入源 table 时出现错误.
我在 shell 脚本上使用它:
myDate=$(date +"%Y%m%d%I%M")
myPath=/tmp/test
myDataSource="external"
myTableName=tableSchema.sourceTable
db2 +w -vm "export to $myPath/$myDataSource.$myTableName.$myDate.ixf of ixf
messages $myPath/$myDataSource.$myTableName.$myDate.ixf.xmsg
SELECT * from $myTableName"
进一步调查,似乎插入了一个奇怪的字符“▒”。我检查了来源,没有任何奇怪的字符。所以在检查细节后我发出了这个命令:
select *
from SYSIBM.SYSCOLUMNS
where
tbcreator = 'SOURCESCHEMA'
and tbname = 'SOURCETABLE'
for fetch only with ur;
这表明源列上的 CCSID 是 37。我在目标模式上做了同样的事情,列的 CCSID 是 1208。
当我再次尝试导出 table 时强制它转换为 CCSID 1208 添加 修改代码页=1208:
db2 +w -vm "export to $myPath/$myDataSource.$myTableName.$myDate.ixf of ixf
modified by codepage=1208
messages $myPath/$myDataSource.$myTableName.$myDate.ixf.xmsg
SELECT * from $myTableName"
这会导致脚本运行,但我收到此警告:
SQL3132W The character data in column "COLUMN" will be truncated to size "4".
所述列在源和目标上的大小相同,但似乎由于 CCSID,我需要更改目标上的大小(我无法更改源上的任何内容和更改 CCSID目标会破坏目标上的东西)所以,我的问题是:
- 如何根据编码计算每个 varchar/char 列所需的大小,例如,如果 CCSID 37 上的 varchar(4) 需要 varchar(5) 来保存 CCSID 1208 的值?
是否可以这样做:
SELECT CAST(COLUMN as VARCHAR(12) CCSID 1208) -- 对于所有列 来自 tableSchema.sourceTable;
所以我不会丢失这些字符串的任何部分。
- 数字呢?
谢谢!
最后,我最终使用了这个
SELECT
CAST(COLUMN AS VARCHAR(12) CCSID 1208) as COLUMN,
CAST(COLUMN2 AS VARCHAR(12) CCSID 1208) as COLUMN2,
(...),
CAST(COLUMNM AS VARCHAR(12) CCSID 1208) as COLUMNM,
FROM tableSchema.sourceTable;
跨代码页转换,没有出现截断。