如何使用UTF-8编码提取Teradata.TPT文件

如何使用UTF-8编码提取Teradata.TPT文件,teradata,extraction,teradata-sql-assistant,Teradata,Extraction,Teradata Sql Assistant,我们目前正在提取几个Teradata.TPT文件,我们将上传到AWS S3,但是这些文件都带有ANSI编码 我需要它们与编码UTF-8一起提供,您必须在TPT脚本中指定字符集。在顶部添加: USING CHARACTER SET UTF8 棘手的部分是UTF8这里每个字符有3个字节,因此在DEFINE SCHEMA中,必须将每个字段的大小增加三倍 例如,如果您的架构如下所示: DEFINE SCHEMA s_some_export ( status VAR

我们目前正在提取几个Teradata.TPT文件,我们将上传到AWS S3,但是这些文件都带有ANSI编码


我需要它们与编码UTF-8一起提供,您必须在TPT脚本中指定字符集。在顶部添加:

USING CHARACTER SET UTF8
棘手的部分是
UTF8
这里每个字符有3个字节,因此在
DEFINE SCHEMA
中,必须将每个字段的大小增加三倍

例如,如果您的架构如下所示:

   DEFINE SCHEMA s_some_export
    (
            status VARCHAR(20),
            userid VARCHAR(20),
            firstname VARCHAR(64),
    );
您必须将值增加三倍以适应UTF8字符:

   DEFINE SCHEMA s_some_export
    (
            status VARCHAR(60),
            userid VARCHAR(60),
            firstname VARCHAR(192),
    );
有时,因为我懒惰,我使用字符集UTF16使用
定义我的TPT,这样我只需要两倍的字段大小(数学更容易)。但这意味着我必须在提取后将其转换为UTF8。在Linux中,这将是
iconv-f UTF-16LE-t UTF-8 myoutputfile.csv>myoutputfile.utf8.csv

一些警告:

  • 如果表的字段定义为CHAR和
    字符集拉丁文
    ,则架构可能会遇到列大小问题

  • 日期和时间戳可能会变得更加复杂,因为它们不需要加倍,所以在模式中将它们定义为
    VARCHAR
    ,可能会给您带来麻烦。你可能得在这儿大惊小怪了。我的建议是,更改为TPT选择数据的视图,并将
    CAST(yourdate AS VARCHAR(10))转换为yourdate
    ,然后在模式中使用
    VARCHAR(30)
    ,这样在定义模式时就不必考虑字段类型。这意味着在提取过程中会有额外的CPU开销,但除非资源紧张,否则我认为这是值得的。我也很懒,而且总是很乐意让该死的TPT在没有调试的情况下提取数据


  • 会话字符集可能会影响Teradata的数据输出。Teradata,您将如何配置此功能?