Oracle 与 HANA 字符数据类型处理
Oracle vs HANA char data type handling
我们将 Oracle 作为源,将 HANA 1.0 sps12 作为目标。我们通过实时复制使用 Informatica CDC 将 Oracle 镜像到 HANA。在 Oracle 中,对于许多列,我们将数据类型设置为 CHAR,即固定长度数据类型。由于 HANA 官方不支持 CHAR 数据类型,因此我们使用 NVARCHAR 数据类型而不是相同的数据类型。我们面临的问题是——因为在 Oracle 中,CHAR 数据类型是固定长度的,只要实际字符串的长度小于数据类型,就会附加空格,我们在目标 HANA 数据库中有很多额外的空格用于此类列。
例如。如果列 col1 的数据类型为
CHAR(5)
和值为 'A'
,它在 HANA 中被复制为 'A '
即 'A'
附加了四个额外的空格,导致查询和数据解释中的很多问题
是否可以在 HANA 中实现类似 CHAR 的数据类型?
我不了解 HANA,这更像是评论而不是答案,但我选择把它放在这里是因为我希望您能看到一些代码。
这是一个 table,其列是 CHAR
数据类型:
SQL> create table test (col char(10));
Table created.
SQL> insert into test values ('abc');
1 row created.
列的长度为 10(您已经知道):
SQL> select length(col) from test;
LENGTH(COL)
-----------
10
但是,如果你 TRIM 它,你会得到更好的结果,你正在寻找的那个:
SQL> select length( TRIM (col)) from test;
LENGTH(TRIM(COL))
-----------------
3
SQL>
因此:如果您可以说服 镜像过程对这些列应用TRIM
函数,您可能会得到想要的结果。
[编辑,在看到 Lars 的评论并重新阅读问题后]
对;这个问题似乎与我最初理解的恰恰相反。如果那是重点,也许 RPAD
会有所帮助。这是一个例子:
SQL> create table test (col varchar2(10));
Table created.
SQL> insert into test values ('abc');
1 row created.
SQL> select length(col) from test;
LENGTH(COL)
-----------
3
SQL> insert into test values (rpad('def', 10, ' '));
1 row created.
SQL> select col, length(col) len from test;
COL LEN
---------- ----------
abc 3
def 10
SQL>
您可以在将数据传输到 Hana 时使用 Informatica 中的 RPAD
功能。只需确保 Hana 不会自动 trim。
因此,对于 CHAR(5) 源列,您应该使用:
out_Column = RPAD(input_Column, 5)
非常准确,如文档所述:
我们将 Oracle 作为源,将 HANA 1.0 sps12 作为目标。我们通过实时复制使用 Informatica CDC 将 Oracle 镜像到 HANA。在 Oracle 中,对于许多列,我们将数据类型设置为 CHAR,即固定长度数据类型。由于 HANA 官方不支持 CHAR 数据类型,因此我们使用 NVARCHAR 数据类型而不是相同的数据类型。我们面临的问题是——因为在 Oracle 中,CHAR 数据类型是固定长度的,只要实际字符串的长度小于数据类型,就会附加空格,我们在目标 HANA 数据库中有很多额外的空格用于此类列。
例如。如果列 col1 的数据类型为
CHAR(5)
和值为 'A'
,它在 HANA 中被复制为 'A '
即 'A'
附加了四个额外的空格,导致查询和数据解释中的很多问题
是否可以在 HANA 中实现类似 CHAR 的数据类型?
我不了解 HANA,这更像是评论而不是答案,但我选择把它放在这里是因为我希望您能看到一些代码。
这是一个 table,其列是 CHAR
数据类型:
SQL> create table test (col char(10));
Table created.
SQL> insert into test values ('abc');
1 row created.
列的长度为 10(您已经知道):
SQL> select length(col) from test;
LENGTH(COL)
-----------
10
但是,如果你 TRIM 它,你会得到更好的结果,你正在寻找的那个:
SQL> select length( TRIM (col)) from test;
LENGTH(TRIM(COL))
-----------------
3
SQL>
因此:如果您可以说服 镜像过程对这些列应用TRIM
函数,您可能会得到想要的结果。
[编辑,在看到 Lars 的评论并重新阅读问题后]
对;这个问题似乎与我最初理解的恰恰相反。如果那是重点,也许 RPAD
会有所帮助。这是一个例子:
SQL> create table test (col varchar2(10));
Table created.
SQL> insert into test values ('abc');
1 row created.
SQL> select length(col) from test;
LENGTH(COL)
-----------
3
SQL> insert into test values (rpad('def', 10, ' '));
1 row created.
SQL> select col, length(col) len from test;
COL LEN
---------- ----------
abc 3
def 10
SQL>
您可以在将数据传输到 Hana 时使用 Informatica 中的 RPAD
功能。只需确保 Hana 不会自动 trim。
因此,对于 CHAR(5) 源列,您应该使用:
out_Column = RPAD(input_Column, 5)
非常准确,如文档所述: