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

How to extract a Teradata .TPT file with UTF-8 encoding

我们目前正在提取几个我们将上传到 AWS S3 的 Teradata .TPT 文件,但是这些文件带有 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),
    );

有时,因为我很懒,我用 USING CHARACTER SET UTF16 定义我的 TPT,这样我只需要将每个字段大小加倍(数学更容易)。但这意味着我必须在提取后将其转换为 UTF8。在 Linux 中,这只是 iconv -f UTF-16LE -t UTF-8 myoutputfile.csv > myoutputfile.utf8.csv

一些注意事项:

  1. 如果您的 table 字段被定义为 CHAR 并且 CHARACTER SET LATIN 那么您可能 运行 遇到您的架构的列大小问题。 see here

  2. 日期和时间戳可能会变得很奇怪,因为它们不需要加倍,因此在您的架构中将它们定义为 VARCHAR 会给您带来麻烦。您可能需要在这里大惊小怪。我的建议是更改您从中为 TPT 和 CAST(yourdate AS VARCHAR(10)) as yourdate 选择数据的视图,然后在您的架构中使用 VARCHAR(30) 这样您就不必在定义您的字段时考虑字段类型模式。这意味着在提取过程中会产生额外的 CPU 开销,但除非您 运行 资源紧张,否则我认为这是值得的。我也很懒惰,总是很高兴只用该死的 TPT 来提取数据而无需太多调试。